3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Synchronization</title>
5 <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
7 <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
8 <link rel="up" href="../thread.html" title="Chapter 30. Thread 4.4.0">
9 <link rel="prev" href="ScopedThreads.html" title="Scoped Threads">
10 <link rel="next" href="thread_local_storage.html" title="Thread Local Storage">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
15 <td align="center"><a href="../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="ScopedThreads.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="thread_local_storage.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="thread.synchronization"></a><a class="link" href="synchronization.html" title="Synchronization">Synchronization</a>
28 </h2></div></div></div>
29 <div class="toc"><dl class="toc">
30 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial">Tutorial</a></span></dt>
31 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts">Mutex Concepts</a></span></dt>
32 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option">Lock Options</a></span></dt>
33 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard">Lock Guard</a></span></dt>
34 <dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard">With Lock Guard</a></span></dt>
35 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts">Lock Concepts</a></span></dt>
36 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks">Lock Types</a></span></dt>
37 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks">Other Lock Types
38 - EXTENSION</a></span></dt>
39 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions">Lock functions</a></span></dt>
40 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories">Lock Factories
41 - EXTENSION</a></span></dt>
42 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types">Mutex Types</a></span></dt>
43 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref">Condition Variables</a></span></dt>
44 <dt><span class="section"><a href="synchronization.html#thread.synchronization.once">One-time Initialization</a></span></dt>
45 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers">Barriers -- EXTENSION</a></span></dt>
46 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches">Latches -- EXPERIMENTAL</a></span></dt>
47 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors">Executors and Schedulers
48 -- EXPERIMENTAL</a></span></dt>
49 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures">Futures</a></span></dt>
52 <div class="titlepage"><div><div><h3 class="title">
53 <a name="thread.synchronization.tutorial"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial" title="Tutorial">Tutorial</a>
54 </h3></div></div></div>
55 <div class="toc"><dl class="toc">
56 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking">Internal
57 Locking</a></span></dt>
58 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes">External
59 Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
60 <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a></span></dt>
61 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.with">Executing Around
62 a Function</a></span></dt>
65 <a href="http://home.roadrunner.com/~hinnant/mutexes/locking.html" target="_top">Handling
66 mutexes in C++</a> is an excellent tutorial. You need just replace std
70 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html" target="_top">Mutex,
71 Lock, Condition Variable Rationale</a> adds rationale for the design
72 decisions made for mutexes, locks and condition variables.
75 In addition to the C++11 standard locks, Boost.Thread provides other locks
76 and some utilities that help the user to make their code thread-safe.
79 <div class="titlepage"><div><div><h4 class="title">
80 <a name="thread.synchronization.tutorial.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking" title="Internal Locking">Internal
82 </h4></div></div></div>
83 <div class="toc"><dl class="toc">
84 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution">Concurrent
85 threads of execution</a></span></dt>
86 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking">Internal
87 locking</a></span></dt>
88 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking">Internal
89 and external locking</a></span></dt>
91 <div class="note"><table border="0" summary="Note">
93 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
94 <th align="left">Note</th>
96 <tr><td align="left" valign="top"><p>
97 This tutorial is an adaptation of chapter Concurrency of the Object-Oriented
98 Programming in the BETA Programming Language and of the paper of Andrei
99 Alexandrescu "Multithreading and the C++ Type System" to the
103 <div class="section">
104 <div class="titlepage"><div><div><h5 class="title">
105 <a name="thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution" title="Concurrent threads of execution">Concurrent
106 threads of execution</a>
107 </h5></div></div></div>
109 Consider, for example, modeling a bank account class that supports simultaneous
110 deposits and withdrawals from multiple locations (arguably the "Hello,
111 World" of multithreaded programming).
114 From here a component is a model of the <code class="computeroutput"><span class="identifier">Callable</span></code>
118 I C++11 (Boost) concurrent execution of a component is obtained by means
119 of the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span></code>(<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>):
121 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">S</span><span class="special">);</span>
124 where <code class="computeroutput"><span class="identifier">S</span></code> is a model of
125 <code class="computeroutput"><span class="identifier">Callable</span></code>. The meaning
126 of this expression is that execution of <code class="computeroutput"><span class="identifier">S</span><span class="special">()</span></code> will take place concurrently with the
127 current thread of execution executing the expression.
130 The following example includes a bank account of a person (Joe) and two
131 components, one corresponding to a bank agent depositing money in Joe's
132 account, and one representing Joe. Joe will only be withdrawing money
135 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span><span class="special">;</span>
137 <span class="identifier">BankAccount</span> <span class="identifier">JoesAccount</span><span class="special">;</span>
139 <span class="keyword">void</span> <span class="identifier">bankAgent</span><span class="special">()</span>
140 <span class="special">{</span>
141 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">></span><span class="number">0</span><span class="special">;</span> <span class="special">--</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
142 <span class="comment">//...</span>
143 <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Deposit</span><span class="special">(</span><span class="number">500</span><span class="special">);</span>
144 <span class="comment">//...</span>
145 <span class="special">}</span>
146 <span class="special">}</span>
148 <span class="keyword">void</span> <span class="identifier">Joe</span><span class="special">()</span> <span class="special">{</span>
149 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">></span><span class="number">0</span><span class="special">;</span> <span class="special">--</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
150 <span class="comment">//...</span>
151 <span class="keyword">int</span> <span class="identifier">myPocket</span> <span class="special">=</span> <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
152 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">myPocket</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
153 <span class="comment">//...</span>
154 <span class="special">}</span>
155 <span class="special">}</span>
157 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
158 <span class="comment">//...</span>
159 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">bankAgent</span><span class="special">);</span> <span class="comment">// start concurrent execution of bankAgent</span>
160 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread2</span><span class="special">(</span><span class="identifier">Joe</span><span class="special">);</span> <span class="comment">// start concurrent execution of Joe</span>
161 <span class="identifier">thread1</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
162 <span class="identifier">thread2</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
163 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
164 <span class="special">}</span>
167 From time to time, the <code class="computeroutput"><span class="identifier">bankAgent</span></code>
168 will deposit $500 in <code class="computeroutput"><span class="identifier">JoesAccount</span></code>.
169 <code class="computeroutput"><span class="identifier">Joe</span></code> will similarly withdraw
170 $100 from his account. These sentences describe that the <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code>
171 are executed concurrently.
174 <div class="section">
175 <div class="titlepage"><div><div><h5 class="title">
176 <a name="thread.synchronization.tutorial.internal_locking.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking" title="Internal locking">Internal
178 </h5></div></div></div>
180 The above example works well as long as the components <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code>
181 doesn't access <code class="computeroutput"><span class="identifier">JoesAccount</span></code>
182 at the same time. There is, however, no guarantee that this will not
183 happen. We may use a mutex to guarantee exclusive access to each bank.
185 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
186 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
187 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
188 <span class="keyword">public</span><span class="special">:</span>
189 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
190 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
191 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
192 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
193 <span class="special">}</span>
194 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
195 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
196 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
197 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
198 <span class="special">}</span>
199 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
200 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
201 <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">balance_</span><span class="special">;</span>
202 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
203 <span class="keyword">return</span> <span class="identifier">b</span><span class="special">;</span>
204 <span class="special">}</span>
205 <span class="special">};</span>
208 Execution of the <code class="computeroutput"><span class="identifier">Deposit</span></code>
209 and <code class="computeroutput"><span class="identifier">Withdraw</span></code> operations
210 will no longer be able to make simultaneous access to balance.
213 A mutex is a simple and basic mechanism for obtaining synchronization.
214 In the above example it is relatively easy to be convinced that the synchronization
215 works correctly (in the absence of exception). In a system with several
216 concurrent objects and several shared objects, it may be difficult to
217 describe synchronization by means of mutexes. Programs that make heavy
218 use of mutexes may be difficult to read and write. Instead, we shall
219 introduce a number of generic classes for handling more complicated forms
220 of synchronization and communication.
223 With the RAII idiom we can simplify a lot this using the scoped locks.
224 In the code below, guard's constructor locks the passed-in object <code class="computeroutput"><span class="identifier">mtx_</span></code>, and guard's destructor unlocks
225 <code class="computeroutput"><span class="identifier">mtx_</span></code>.
227 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
228 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span> <span class="comment">// explicit mutex declaration </span>
229 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
230 <span class="keyword">public</span><span class="special">:</span>
231 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
232 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
233 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
234 <span class="special">}</span>
235 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
236 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
237 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
238 <span class="special">}</span>
239 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
240 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
241 <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
242 <span class="special">}</span>
243 <span class="special">};</span>
246 The object-level locking idiom doesn't cover the entire richness of a
247 threading model. For example, the model above is quite deadlock-prone
248 when you try to coordinate multi-object transactions. Nonetheless, object-level
249 locking is useful in many cases, and in combination with other mechanisms
250 can provide a satisfactory solution to many threaded access problems
251 in object-oriented programs.
254 <div class="section">
255 <div class="titlepage"><div><div><h5 class="title">
256 <a name="thread.synchronization.tutorial.internal_locking.internal_and_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking" title="Internal and external locking">Internal
257 and external locking</a>
258 </h5></div></div></div>
260 The BankAccount class above uses internal locking. Basically, a class
261 that uses internal locking guarantees that any concurrent calls to its
262 public member functions don't corrupt an instance of that class. This
263 is typically ensured by having each public member function acquire a
264 lock on the object upon entry. This way, for any given object of that
265 class, there can be only one member function call active at any moment,
266 so the operations are nicely serialized.
269 This approach is reasonably easy to implement and has an attractive simplicity.
270 Unfortunately, "simple" might sometimes morph into "simplistic."
273 Internal locking is insufficient for many real-world synchronization
274 tasks. Imagine that you want to implement an ATM withdrawal transaction
275 with the BankAccount class. The requirements are simple. The ATM transaction
276 consists of two withdrawals-one for the actual money and one for the
277 $2 commission. The two withdrawals must appear in strict sequence; that
278 is, no other transaction can exist between them.
281 The obvious implementation is erratic:
283 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span>
284 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
285 <span class="comment">// preemption possible</span>
286 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
287 <span class="special">}</span>
290 The problem is that between the two calls above, another thread can perform
291 another operation on the account, thus breaking the second design requirement.
294 In an attempt to solve this problem, let's lock the account from the
295 outside during the two operations:
297 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span>
298 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">.</span><span class="identifier">mtx_</span><span class="special">);</span> <span class="number">1</span>
299 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
300 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
301 <span class="special">}</span>
304 Notice that the code above doesn't compile, the <code class="computeroutput"><span class="identifier">mtx_</span></code>
305 field is private. We have two possibilities:
307 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
308 <li class="listitem">
309 make <code class="computeroutput"><span class="identifier">mtx_</span></code> public
312 <li class="listitem">
313 make the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
314 lockable by adding the lock/unlock functions
318 We can add these functions explicitly
320 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
321 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
322 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
323 <span class="keyword">public</span><span class="special">:</span>
324 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
325 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
326 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
327 <span class="special">}</span>
328 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
329 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
330 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
331 <span class="special">}</span>
332 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">()</span> <span class="special">{</span>
333 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
334 <span class="special">}</span>
335 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">()</span> <span class="special">{</span>
336 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
337 <span class="special">}</span>
338 <span class="special">};</span>
341 or inheriting from a class which add these lockable functions.
344 The <code class="computeroutput"><span class="identifier">basic_lockable_adapter</span></code>
345 class helps to define the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
348 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
349 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span>
350 <span class="special">{</span>
351 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
352 <span class="keyword">public</span><span class="special">:</span>
353 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
354 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
355 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
356 <span class="special">}</span>
357 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
358 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
359 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
360 <span class="special">}</span>
361 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
362 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
363 <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
364 <span class="special">}</span>
365 <span class="special">};</span>
368 and the code that doesn't compiles becomes
370 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span>
371 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span>
372 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
373 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
374 <span class="special">}</span>
377 Notice that now acct is being locked by Withdraw after it has already
378 been locked by guard. When running such code, one of two things happens.
380 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
381 <li class="listitem">
382 Your mutex implementation might support the so-called recursive mutex
383 semantics. This means that the same thread can lock the same mutex
384 several times successfully. In this case, the implementation works
385 but has a performance overhead due to unnecessary locking. (The locking/unlocking
386 sequence in the two Withdraw calls is not needed but performed anyway-and
389 <li class="listitem">
390 Your mutex implementation might not support recursive locking, which
391 means that as soon as you try to acquire it the second time, it blocks-so
392 the ATMWithdrawal function enters the dreaded deadlock.
396 As <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code> is not recursive, we need to
397 use its recursive version <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code>.
399 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
400 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">></span>
401 <span class="special">{</span>
403 <span class="comment">// ...</span>
404 <span class="special">};</span>
407 The caller-ensured locking approach is more flexible and the most efficient,
408 but very dangerous. In an implementation using caller-ensured locking,
409 BankAccount still holds a mutex, but its member functions don't manipulate
410 it at all. Deposit and Withdraw are not thread-safe anymore. Instead,
411 the client code is responsible for locking BankAccount properly.
413 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
414 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">></span> <span class="special">{</span>
415 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
416 <span class="keyword">public</span><span class="special">:</span>
417 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
418 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
419 <span class="special">}</span>
420 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
421 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
422 <span class="special">}</span>
423 <span class="special">};</span>
426 Obviously, the caller-ensured locking approach has a safety problem.
427 BankAccount's implementation code is finite, and easy to reach and maintain,
428 but there's an unbounded amount of client code that manipulates BankAccount
429 objects. In designing applications, it's important to differentiate between
430 requirements imposed on bounded code and unbounded code. If your class
431 makes undue requirements on unbounded code, that's usually a sign that
432 encapsulation is out the window.
435 To conclude, if in designing a multi-threaded class you settle on internal
436 locking, you expose yourself to inefficiency or deadlocks. On the other
437 hand, if you rely on caller-provided locking, you make your class error-prone
438 and difficult to use. Finally, external locking completely avoids the
439 issue by leaving it all to the client code.
443 <div class="section">
444 <div class="titlepage"><div><div><h4 class="title">
445 <a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes" title="External Locking -- strict_lock and externally_locked classes">External
446 Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
447 <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a>
448 </h4></div></div></div>
449 <div class="toc"><dl class="toc">
450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits">Locks
451 as permits</a></span></dt>
452 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking">Improving
453 External Locking</a></span></dt>
454 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks">Allowing
455 other strict locks</a></span></dt>
457 <div class="note"><table border="0" summary="Note">
459 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
460 <th align="left">Note</th>
462 <tr><td align="left" valign="top"><p>
463 This tutorial is an adaptation of the paper by Andrei Alexandrescu "Multithreading
464 and the C++ Type System" to the Boost library.
467 <div class="section">
468 <div class="titlepage"><div><div><h5 class="title">
469 <a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits" title="Locks as permits">Locks
471 </h5></div></div></div>
473 So what to do? Ideally, the BankAccount class should do the following:
475 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
476 <li class="listitem">
477 Support both locking models (internal and external).
479 <li class="listitem">
480 Be efficient; that is, use no unnecessary locking.
482 <li class="listitem">
483 Be safe; that is, BankAccount objects cannot be manipulated without
488 Let's make a worthwhile observation: Whenever you lock a BankAccount,
489 you do so by using a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object. Turning this statement around,
490 wherever there's a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>, there's also a locked <code class="computeroutput"><span class="identifier">BankAccount</span></code> somewhere. Thus, you can
491 think of-and use-a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object as a permit. Owning a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>
492 gives you rights to do certain things. The <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object should not be copied or aliased
493 (it's not a transmissible permit).
495 <div class="orderedlist"><ol class="orderedlist" type="1">
496 <li class="listitem">
497 As long as a permit is still alive, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
500 <li class="listitem">
501 When the <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> is destroyed, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>'s mutex is released.
505 The net effect is that at any point in your code, having access to a
506 <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>
507 object guarantees that a <code class="computeroutput"><span class="identifier">BankAccount</span></code>
508 is locked. (You don't know exactly which <code class="computeroutput"><span class="identifier">BankAccount</span></code>
509 is locked, however-an issue that we'll address soon.)
512 For now, let's make a couple of enhancements to the <code class="computeroutput"><span class="identifier">lock_guard</span></code>
513 class template defined in Boost.Thread. We'll call the enhanced version
514 <code class="computeroutput"><span class="identifier">strict_lock</span></code>. Essentially,
515 a <code class="computeroutput"><span class="identifier">strict_lock</span></code>'s role
516 is only to live on the stack as an automatic variable. <code class="computeroutput"><span class="identifier">strict_lock</span></code> must adhere to a non-copy
517 and non-alias policy. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
518 disables copying by making the copy constructor and the assignment operator
521 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
522 <span class="keyword">class</span> <span class="identifier">strict_lock</span> <span class="special">{</span>
523 <span class="keyword">public</span><span class="special">:</span>
524 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">lockable_type</span><span class="special">;</span>
527 <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span> <span class="special">{</span>
528 <span class="identifier">obj</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// locks on construction</span>
529 <span class="special">}</span>
530 <span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
531 <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&)</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="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
534 <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 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="comment">// strict lockers specific function </span>
537 <span class="special">{</span>
538 <span class="keyword">return</span> <span class="identifier">l</span> <span class="special">==</span> <span class="special">&</span><span class="identifier">obj_</span><span class="special">;</span>
539 <span class="special">}</span>
540 <span class="keyword">private</span><span class="special">:</span>
541 <span class="identifier">lockable_type</span><span class="special">&</span> <span class="identifier">obj_</span><span class="special">;</span>
542 <span class="special">};</span>
545 Silence can be sometimes louder than words-what's forbidden to do with
546 a <code class="computeroutput"><span class="identifier">strict_lock</span></code> is as important
547 as what you can do. Let's see what you can and what you cannot do with
548 a <code class="computeroutput"><span class="identifier">strict_lock</span></code> instantiation:
550 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
551 You can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> only starting from a valid T
552 object. Notice that there is no other way you can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>.
554 <pre class="programlisting"><span class="identifier">BankAccount</span> <span class="identifier">myAccount</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span>
555 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">myLock</span><span class="special">(</span><span class="identifier">myAccount</span><span class="special">);</span> <span class="comment">// ok</span>
557 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
558 You cannot copy <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
559 to one another. In particular, you cannot pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
560 by value to functions or have them returned by functions:
562 <pre class="programlisting"><span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">Foo</span><span class="special">();</span> <span class="comment">// compile-time error</span>
563 <span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>);</span> <span class="comment">// compile-time error</span>
565 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
566 However, you still can pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
567 by reference to and from functions:
569 <pre class="programlisting"><span class="comment">// ok, Foo returns a reference to strict_lock<BankAccount></span>
570 <span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&</span> <span class="identifier">Foo</span><span class="special">();</span>
571 <span class="comment">// ok, Bar takes a reference to strict_lock<BankAccount></span>
572 <span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&);</span>
575 All these rules were put in place with one purpose-enforcing that owning
576 a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
577 is a reasonably strong guarantee that
579 <div class="orderedlist"><ol class="orderedlist" type="1">
580 <li class="listitem">
581 you locked a T object, and
583 <li class="listitem">
584 that object will be unlocked at a later point.
588 Now that we have such a strict <code class="computeroutput"><span class="identifier">strict_lock</span></code>,
589 how do we harness its power in defining a safe, flexible interface for
590 BankAccount? The idea is as follows:
592 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
593 <li class="listitem">
594 Each of BankAccount's interface functions (in our case, Deposit and
595 Withdraw) comes in two overloaded variants.
597 <li class="listitem">
598 One version keeps the same signature as before, and the other takes
599 an additional argument of type <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>. The first version is internally
600 locked; the second one requires external locking. External locking
601 is enforced at compile time by requiring client code to create a
602 <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>
605 <li class="listitem">
606 BankAccount avoids code bloating by having the internal locked functions
607 forward to the external locked functions, which do the actual job.
611 A little code is worth 1,000 words, a (hacked into) saying goes, so here's
612 the new BankAccount class:
614 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
615 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">recursive_mutex</span><span class="special">></span>
616 <span class="special">{</span>
617 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
618 <span class="keyword">public</span><span class="special">:</span>
619 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span> <span class="special">{</span>
620 <span class="comment">// Externally locked</span>
621 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
622 <span class="special">}</span>
623 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
624 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> <span class="comment">// Internally locked</span>
625 <span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
626 <span class="special">}</span>
627 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span> <span class="special">{</span>
628 <span class="comment">// Externally locked</span>
629 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
630 <span class="special">}</span>
631 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
632 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> <span class="comment">// Internally locked</span>
633 <span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
634 <span class="special">}</span>
635 <span class="special">};</span>
638 Now, if you want the benefit of internal locking, you simply call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code> and
639 <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>.
640 If you want to use external locking, you lock the object by constructing
641 a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>
642 and then you call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span>
643 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code>
644 and <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code>.
645 For example, here's the <code class="computeroutput"><span class="identifier">ATMWithdrawal</span></code>
646 function implemented correctly:
648 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span>
649 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span>
650 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
651 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
652 <span class="special">}</span>
655 This function has the best of both worlds-it's reasonably safe and efficient
659 It's worth noting that <code class="computeroutput"><span class="identifier">strict_lock</span></code>
660 being a template gives extra safety compared to a straight polymorphic
661 approach. In such a design, BankAccount would derive from a Lockable
662 interface. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
663 would manipulate Lockable references so there's no need for templates.
664 This approach is sound; however, it provides fewer compile-time guarantees.
665 Having a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
666 object would only tell that some object derived from Lockable is currently
667 locked. In the templated approach, having a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> gives a stronger guarantee-it's a
668 <code class="computeroutput"><span class="identifier">BankAccount</span></code> that stays
672 There's a weasel word in there-I mentioned that ATMWithdrawal is reasonably
673 safe. It's not really safe because there's no enforcement that the <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>
674 object locks the appropriate BankAccount object. The type system only
675 ensures that some BankAccount object is locked. For example, consider
676 the following phony implementation of ATMWithdrawal:
678 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span>
679 <span class="identifier">BankAccount</span> <span class="identifier">fakeAcct</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span>
680 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">fakeAcct</span><span class="special">);</span>
681 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
682 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
683 <span class="special">}</span>
686 This code compiles warning-free but obviously doesn't do the right thing-it
687 locks one account and uses another.
690 It's important to understand what can be enforced within the realm of
691 the C++ type system and what needs to be enforced at runtime. The mechanism
692 we've put in place so far ensures that some BankAccount object is locked
693 during the call to <code class="computeroutput"><span class="identifier">BankAccount</span><span class="special">::</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span>
694 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code>.
695 We must enforce at runtime exactly what object is locked.
698 If our scheme still needs runtime checks, how is it useful? An unwary
699 or malicious programmer can easily lock the wrong object and manipulate
700 any BankAccount without actually locking it.
703 First, let's get the malice issue out of the way. C is a language that
704 requires a lot of attention and discipline from the programmer. C++ made
705 some progress by asking a little less of those, while still fundamentally
706 trusting the programmer. These languages are not concerned with malice
707 (as Java is, for example). After all, you can break any C/C++ design
708 simply by using casts "appropriately" (if appropriately is
709 an, er, appropriate word in this context).
712 The scheme is useful because the likelihood of a programmer forgetting
713 about any locking whatsoever is much greater than the likelihood of a
714 programmer who does remember about locking, but locks the wrong object.
717 Using <code class="computeroutput"><span class="identifier">strict_lock</span></code> permits
718 compile-time checking of the most common source of errors, and runtime
719 checking of the less frequent problem.
722 Let's see how to enforce that the appropriate BankAccount object is locked.
723 First, we need to add a member function to the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
724 class template. The <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Loclable</span><span class="special">*)</span></code>
725 function returns a reference to the locked object.
727 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">strict_lock</span> <span class="special">{</span>
728 <span class="special">...</span> <span class="identifier">as</span> <span class="identifier">before</span> <span class="special">...</span>
729 <span class="keyword">public</span><span class="special">:</span>
730 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mtx</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">mtx</span><span class="special">==&</span><span class="identifier">obj_</span><span class="special">;</span> <span class="special">}</span>
731 <span class="special">};</span>
734 Second, BankAccount needs to use this function compare the locked object
737 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
738 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span><span class="special">></span>
739 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
740 <span class="keyword">public</span><span class="special">:</span>
741 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&</span> <span class="identifier">guard</span><span class="special">)</span> <span class="special">{</span>
742 <span class="comment">// Externally locked</span>
743 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">guard</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span>
744 <span class="keyword">throw</span> <span class="string">"Locking Error: Wrong Object Locked"</span><span class="special">;</span>
745 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
746 <span class="special">}</span>
747 <span class="comment">// ...</span>
748 <span class="special">};</span>
751 The overhead incurred by the test above is much lower than locking a
752 recursive mutex for the second time.
755 <div class="section">
756 <div class="titlepage"><div><div><h5 class="title">
757 <a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking" title="Improving External Locking">Improving
759 </h5></div></div></div>
761 Now let's assume that BankAccount doesn't use its own locking at all,
762 and has only a thread-neutral implementation:
764 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
765 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
766 <span class="keyword">public</span><span class="special">:</span>
767 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
768 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
769 <span class="special">}</span>
770 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
771 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
772 <span class="special">}</span>
773 <span class="special">};</span>
776 Now you can use BankAccount in single-threaded and multi-threaded applications
777 alike, but you need to provide your own synchronization in the latter
781 Say we have an AccountManager class that holds and manipulates a BankAccount
784 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
785 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span>
786 <span class="special">{</span>
787 <span class="identifier">BankAccount</span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
788 <span class="identifier">BankAccount</span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
789 <span class="special">...</span>
790 <span class="special">};</span>
793 Let's also assume that, by design, AccountManager must stay locked while
794 accessing its BankAccount members. The question is, how can we express
795 this design constraint using the C++ type system? How can we state "You
796 have access to this BankAccount object only after locking its parent
797 AccountManager object"?
800 The solution is to use a little bridge template <code class="computeroutput"><span class="identifier">externally_locked</span></code>
801 that controls access to a BankAccount.
803 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
804 <span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
805 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">LockableConcept</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>));</span>
807 <span class="keyword">public</span><span class="special">:</span>
808 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span>
809 <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span>
810 <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
811 <span class="special">{}</span>
813 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span>
814 <span class="special">:</span> <span class="identifier">obj_</span><span class="special">()</span>
815 <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
816 <span class="special">{}</span>
818 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span>
820 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
821 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&</span><span class="identifier">lockable_</span><span class="special">))</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> <span class="identifier">run</span> <span class="identifier">time</span> <span class="identifier">check</span> <span class="keyword">throw</span> <span class="keyword">if</span> <span class="keyword">not</span> <span class="identifier">locks</span> <span class="identifier">the</span> <span class="identifier">same</span>
822 <span class="preprocessor">#endif</span>
823 <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
824 <span class="special">}</span>
825 <span class="keyword">void</span> <span class="identifier">set</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span> <span class="special">{</span>
826 <span class="identifier">obj_</span> <span class="special">=</span> <span class="identifier">obj</span><span class="special">;</span>
827 <span class="identifier">lockable_</span><span class="special">=</span><span class="identifier">lockable</span><span class="special">;</span>
828 <span class="special">}</span>
829 <span class="keyword">private</span><span class="special">:</span>
830 <span class="identifier">T</span> <span class="identifier">obj_</span><span class="special">;</span>
831 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable_</span><span class="special">;</span>
832 <span class="special">};</span>
835 <code class="computeroutput"><span class="identifier">externally_locked</span></code> cloaks
836 an object of type T, and actually provides full access to that object
837 through the get and set member functions, provided you pass a reference
838 to a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Owner</span><span class="special">></span></code>
842 Instead of making <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>
843 and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> of type
844 <code class="computeroutput"><span class="identifier">BankAccount</span></code>, <code class="computeroutput"><span class="identifier">AccountManager</span></code> holds objects of type
845 <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span>
846 <span class="identifier">AccountManager</span><span class="special">></span></code>:
848 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
849 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">thread_mutex</span><span class="special">></span>
850 <span class="special">{</span>
851 <span class="keyword">public</span><span class="special">:</span>
852 <span class="keyword">typedef</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">thread_mutex</span><span class="special">></span> <span class="identifier">lockable_base_type</span><span class="special">;</span>
853 <span class="identifier">AccountManager</span><span class="special">()</span>
854 <span class="special">:</span> <span class="identifier">checkingAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
855 <span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
856 <span class="special">{}</span>
857 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span>
858 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span>
859 <span class="keyword">private</span><span class="special">:</span>
861 <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
862 <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
863 <span class="special">};</span>
866 The pattern is the same as before - to access the BankAccount object
867 cloaked by <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>,
868 you need to call <code class="computeroutput"><span class="identifier">get</span></code>.
869 To call <code class="computeroutput"><span class="identifier">get</span></code>, you need
870 to pass it a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span></code>. The one thing you have to take care
871 of is to not hold pointers or references you obtained by calling <code class="computeroutput"><span class="identifier">get</span></code>. If you do that, make sure that
872 you don't use them after the strict_lock has been destroyed. That is,
873 if you alias the cloaked objects, you're back from "the compiler
874 takes care of that" mode to "you must pay attention" mode.
877 Typically, you use <code class="computeroutput"><span class="identifier">externally_locked</span></code>
878 as shown below. Suppose you want to execute an atomic transfer from your
879 checking account to your savings account:
881 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
882 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
883 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
884 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
885 <span class="special">}</span>
888 We achieved two important goals. First, the declaration of <code class="computeroutput"><span class="identifier">checkingAcct_</span></code> and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code>
889 makes it clear to the code reader that that variable is protected by
890 a lock on an AccountManager. Second, the design makes it impossible to
891 manipulate the two accounts without actually locking a BankAccount.
892 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
893 what could be called active documentation.
896 <div class="section">
897 <div class="titlepage"><div><div><h5 class="title">
898 <a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks" title="Allowing other strict locks">Allowing
899 other strict locks</a>
900 </h5></div></div></div>
902 Now imagine that the AccountManager function needs to take a <code class="computeroutput"><span class="identifier">unique_lock</span></code> in order to reduce the
903 critical regions. And at some time it needs to access to the <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>. As <code class="computeroutput"><span class="identifier">unique_lock</span></code>
904 is not a strict lock the following code doesn't compile:
906 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
907 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">defer_lock</span><span class="special">);</span>
908 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
909 <span class="identifier">guard</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
910 <span class="special">}</span>
911 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> <span class="comment">// COMPILE ERROR</span>
912 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> <span class="comment">// COMPILE ERROR</span>
913 <span class="identifier">do_something_else</span><span class="special">();</span>
914 <span class="special">}</span>
917 We need a way to transfer the ownership from the <code class="computeroutput"><span class="identifier">unique_lock</span></code>
918 to a <code class="computeroutput"><span class="identifier">strict_lock</span></code> during
919 the time we are working with <code class="computeroutput"><span class="identifier">savingsAcct_</span></code>
920 and then restore the ownership on <code class="computeroutput"><span class="identifier">unique_lock</span></code>.
922 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
923 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard1</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">defer_lock</span><span class="special">);</span>
924 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
925 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
926 <span class="special">}</span>
927 <span class="special">{</span>
928 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span>
929 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
930 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
931 <span class="special">}</span>
932 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
933 <span class="special">}</span>
936 In order to make this code compilable we need to store either a Lockable
937 or a <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span></code>
938 reference depending on the constructor. We also need to store which kind
939 of reference we have stored, and in the destructor call either to the
940 Lockable <code class="computeroutput"><span class="identifier">unlock</span></code> or restore
944 This seems too complicated to me. Another possibility is to define a
945 nested strict lock class. The drawback is that instead of having only
946 one strict lock we have two and we need either to duplicate every function
947 taking a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
948 or make these function templates. The problem with template functions
949 is that we don't profit anymore of the C++ type system. We must add some
950 static metafunction that checks that the Locker parameter is a strict
951 lock. The problem is that we can not really check this or can we?. The
952 <code class="computeroutput"><span class="identifier">is_strict_lock</span></code> metafunction
953 must be specialized by the strict lock developer. We need to believe
954 it "sur parole". The advantage is that now we can manage with
955 more than two strict locks without changing our code. This is really
959 Now we need to state that both classes are <code class="computeroutput"><span class="identifier">strict_lock</span></code>s.
961 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">></span>
962 <span class="keyword">struct</span> <span class="identifier">is_strict_lock</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span> <span class="special">{};</span>
964 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
965 <span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">></span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span>
967 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">></span>
968 <span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">></span> <span class="special">></span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span>
971 Well let me show what this <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
972 class looks like and the impacts on the <code class="computeroutput"><span class="identifier">externally_locked</span></code>
973 class and the <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code>
977 First <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
978 class will store on a temporary lock the <code class="computeroutput"><span class="identifier">Locker</span></code>,
979 and transfer the lock ownership on the constructor. On destruction it
980 will restore the ownership. Note the use of <code class="computeroutput"><span class="identifier">lock_traits</span></code>
981 and that the <code class="computeroutput"><span class="identifier">Locker</span></code> needs
982 to have a reference to the mutex otherwise and exception is thrown.
984 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span> <span class="special">></span>
985 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
986 <span class="special">{</span>
987 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">MovableLockerConcept</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>));</span>
988 <span class="keyword">public</span><span class="special">:</span>
989 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">lockable_type</span><span class="special">;</span>
990 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">syntactic_lock_traits</span><span class="special"><</span><span class="identifier">lockable_type</span><span class="special">>::</span><span class="identifier">lock_error</span> <span class="identifier">lock_error</span><span class="special">;</span>
992 <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">)</span>
993 <span class="special">:</span> <span class="identifier">lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">)</span> <span class="comment">// Store reference to locker</span>
994 <span class="special">,</span> <span class="identifier">tmp_lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">move</span><span class="special">())</span> <span class="comment">// Move ownership to temporaty locker </span>
995 <span class="special">{</span>
996 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
997 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span>
998 <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Rollback for coherency purposes </span>
999 <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span>
1000 <span class="special">}</span>
1001 <span class="preprocessor">#endif</span>
1002 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">tmp_lock_</span><span class="special">)</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// ensures it is locked </span>
1003 <span class="special">}</span>
1004 <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="special">{</span>
1005 <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Move ownership to nesting locker </span>
1006 <span class="special">}</span>
1007 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">}</span>
1008 <span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span>
1009 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">l</span><span class="special">==</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span>
1012 <span class="keyword">private</span><span class="special">:</span>
1013 <span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock_</span><span class="special">;</span>
1014 <span class="identifier">Locker</span> <span class="identifier">tmp_lock_</span><span class="special">;</span>
1015 <span class="special">};</span>
1018 The <code class="computeroutput"><span class="identifier">externally_locked</span></code>
1019 get function is now a template function taking a Locker as parameters
1020 instead of a <code class="computeroutput"><span class="identifier">strict_lock</span></code>.
1021 We can add test in debug mode that ensure that the Lockable object is
1024 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
1025 <span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
1026 <span class="keyword">public</span><span class="special">:</span>
1027 <span class="comment">// ...</span>
1028 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Locker</span><span class="special">></span>
1029 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span>
1030 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">StrictLockerConcept</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>));</span>
1032 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// locker is a strict locker "sur parole" </span>
1033 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">,</span>
1034 <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// that locks the same type </span>
1035 <span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_THREAD_EXTERNALLY_LOCKED_DONT_CHECK_OWNERSHIP</span> <span class="comment">// define BOOST_THREAD_EXTERNALLY_LOCKED_NO_CHECK_OWNERSHIP if you don't want to check locker ownership</span>
1036 <span class="keyword">if</span> <span class="special">(!</span> <span class="identifier">lock</span> <span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> <span class="comment">// run time check throw if no locked </span>
1037 <span class="preprocessor">#endif</span>
1038 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
1039 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&</span><span class="identifier">lockable_</span><span class="special">))</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span>
1040 <span class="preprocessor">#endif</span>
1041 <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
1042 <span class="special">}</span>
1043 <span class="special">};</span>
1046 The <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code> function needs
1047 only to replace the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
1048 by a <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>.
1050 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
1051 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard1</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
1052 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
1053 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
1054 <span class="special">}</span>
1055 <span class="special">{</span>
1056 <span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span>
1057 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
1058 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
1059 <span class="special">}</span>
1060 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
1061 <span class="special">}</span>
1065 <div class="section">
1066 <div class="titlepage"><div><div><h4 class="title">
1067 <a name="thread.synchronization.tutorial.with"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.with" title="Executing Around a Function">Executing Around
1069 </h4></div></div></div>
1071 In particular, the library provides a way to lock around the execution
1074 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
1075 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
1076 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span>
1077 <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span>
1078 <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span>
1079 <span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...))</span> <span class="special">{</span>
1080 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
1081 <span class="keyword">return</span> <span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...);</span>
1082 <span class="special">}</span>
1085 that can be used with regular functions:
1087 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">func</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&);</span>
1088 <span class="comment">//...</span>
1089 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
1090 <span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1091 <span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">func</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">));</span>
1096 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span>
1097 <span class="identifier">m</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">))</span>
1098 <span class="special">);</span>
1101 or with lambda expression:
1103 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1104 <span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span>
1105 <span class="identifier">m</span><span class="special">,</span>
1106 <span class="special">[&</span><span class="identifier">a</span><span class="special">](</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
1107 <span class="comment">// this scope is protected by mutex m</span>
1108 <span class="identifier">a</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
1109 <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">4</span><span class="special">;</span>
1110 <span class="special">},</span>
1111 <span class="number">5</span>
1112 <span class="special">);</span>
1116 <div class="section">
1117 <div class="titlepage"><div><div><h3 class="title">
1118 <a name="thread.synchronization.mutex_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts" title="Mutex Concepts">Mutex Concepts</a>
1119 </h3></div></div></div>
1120 <div class="toc"><dl class="toc">
1121 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a></span></dt>
1122 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a></span></dt>
1123 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive">Recursive
1124 Lockable Concept</a></span></dt>
1125 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a></span></dt>
1126 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a></span></dt>
1127 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a></span></dt>
1130 A mutex object facilitates protection against data races and allows thread-safe
1131 synchronization of data between threads. A thread obtains ownership of a
1132 mutex object by calling one of the lock functions and relinquishes ownership
1133 by calling the corresponding unlock function. Mutexes may be either recursive
1134 or non-recursive, and may grant simultaneous ownership to one or many threads.
1135 <span class="bold"><strong>Boost.Thread</strong></span> supplies recursive and non-recursive
1136 mutexes with exclusive ownership semantics, along with a shared ownership
1137 (multiple-reader / single-writer) mutex.
1140 <span class="bold"><strong>Boost.Thread</strong></span> supports four basic concepts
1141 for lockable objects: <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a>. Each mutex type
1142 implements one or more of these concepts, as do the various lock types.
1144 <div class="section">
1145 <div class="titlepage"><div><div><h4 class="title">
1146 <a name="thread.synchronization.mutex_concepts.basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a>
1147 </h4></div></div></div>
1148 <div class="toc"><dl class="toc">
1149 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a></span></dt>
1150 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a></span></dt>
1151 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a></span></dt>
1153 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span>
1155 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1156 <span class="special">{</span>
1158 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1159 <span class="keyword">class</span> <span class="identifier">BasicLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1160 <span class="special">}</span>
1163 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept models exclusive
1164 ownership. A type <code class="computeroutput"><span class="identifier">L</span></code> meets
1165 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements if
1166 the following expressions are well-formed and have the specified semantics
1167 (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1168 <code class="computeroutput"><span class="identifier">L</span></code>):
1170 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1171 <li class="listitem">
1172 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">();</span></code>
1174 <li class="listitem">
1175 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">();</span></code>
1179 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
1180 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1182 <div class="section">
1183 <div class="titlepage"><div><div><h5 class="title">
1184 <a name="thread.synchronization.mutex_concepts.basic_lockable.lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a>
1185 </h5></div></div></div>
1186 <div class="variablelist">
1187 <p class="title"><b></b></p>
1188 <dl class="variablelist">
1189 <dt><span class="term">Requires:</span></dt>
1191 The calling thread doesn't owns the mutex if the mutex is not recursive.
1193 <dt><span class="term">Effects:</span></dt>
1195 The current thread blocks until ownership can be obtained for the
1198 <dt><span class="term">Synchronization:</span></dt>
1200 Prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1201 operations on the same object synchronizes with this operation.
1203 <dt><span class="term">Postcondition:</span></dt>
1205 The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1207 <dt><span class="term">Return type:</span></dt>
1209 <code class="computeroutput"><span class="keyword">void</span></code>.
1211 <dt><span class="term">Throws:</span></dt>
1213 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1216 <dt><span class="term">Error Conditions:</span></dt>
1219 <span class="bold"><strong>operation_not_permitted</strong></span>: if the
1220 thread does not have the privilege to perform the operation.
1223 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>:
1224 if the implementation detects that a deadlock would occur.
1227 <span class="bold"><strong>device_or_resource_busy</strong></span>: if the
1228 mutex is already locked and blocking is not possible.
1231 <dt><span class="term">Thread safety:</span></dt>
1233 If an exception is thrown then a lock shall not have been acquired
1234 for the current thread.
1239 <div class="section">
1240 <div class="titlepage"><div><div><h5 class="title">
1241 <a name="thread.synchronization.mutex_concepts.basic_lockable.unlock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a>
1242 </h5></div></div></div>
1243 <div class="variablelist">
1244 <p class="title"><b></b></p>
1245 <dl class="variablelist">
1246 <dt><span class="term">Requires:</span></dt>
1248 The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1250 <dt><span class="term">Synchronization:</span></dt>
1252 This operation synchronizes with subsequent lock operations that
1253 obtain ownership on the same object.
1255 <dt><span class="term">Effects:</span></dt>
1257 Releases a lock on <code class="computeroutput"><span class="identifier">m</span></code>
1258 by the current thread.
1260 <dt><span class="term">Return type:</span></dt>
1262 <code class="computeroutput"><span class="keyword">void</span></code>.
1264 <dt><span class="term">Throws:</span></dt>
1271 <div class="section">
1272 <div class="titlepage"><div><div><h5 class="title">
1273 <a name="thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable" title="is_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a>
1274 </h5></div></div></div>
1275 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span>
1277 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1278 <span class="special">{</span>
1279 <span class="keyword">namespace</span> <span class="identifier">sync</span>
1280 <span class="special">{</span>
1281 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1282 <span class="keyword">class</span> <span class="identifier">is_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1283 <span class="special">}</span>
1284 <span class="special">}</span>
1287 Some of the algorithms on mutexes use this trait via SFINAE.
1290 This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements.
1292 <div class="warning"><table border="0" summary="Warning">
1294 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1295 <th align="left">Warning</th>
1297 <tr><td align="left" valign="top"><p>
1298 If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1299 to specialize this traits for the models of BasicLockable you could
1305 <div class="section">
1306 <div class="titlepage"><div><div><h4 class="title">
1307 <a name="thread.synchronization.mutex_concepts.lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a>
1308 </h4></div></div></div>
1309 <div class="toc"><dl class="toc">
1310 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a></span></dt>
1311 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a></span></dt>
1313 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span>
1314 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1315 <span class="special">{</span>
1316 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1317 <span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">;</span>
1318 <span class="special">}</span>
1321 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements if it meets
1322 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements and
1323 the following expressions are well-formed and have the specified semantics
1324 (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1325 <code class="computeroutput"><span class="identifier">L</span></code>):
1327 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1328 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span></code></a><span class="special">()</span></code>
1331 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
1332 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1334 <div class="section">
1335 <div class="titlepage"><div><div><h5 class="title">
1336 <a name="thread.synchronization.mutex_concepts.lockable.try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a>
1337 </h5></div></div></div>
1338 <div class="variablelist">
1339 <p class="title"><b></b></p>
1340 <dl class="variablelist">
1341 <dt><span class="term">Requires:</span></dt>
1343 The calling thread doesn't owns the mutex if the mutex is not recursive.
1345 <dt><span class="term">Effects:</span></dt>
1347 Attempt to obtain ownership for the current thread without blocking.
1349 <dt><span class="term">Synchronization:</span></dt>
1351 If <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>
1352 returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> operations on the same object
1353 synchronize with this operation.
1355 <dt><span class="term">Note:</span></dt>
1357 Since <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>
1358 does not synchronize with a failed subsequent <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>, the visibility rules are weak
1359 enough that little would be known about the state after a failure,
1360 even in the absence of spurious failures.
1362 <dt><span class="term">Return type:</span></dt>
1364 <code class="computeroutput"><span class="keyword">bool</span></code>.
1366 <dt><span class="term">Returns:</span></dt>
1368 <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1369 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1372 <dt><span class="term">Postcondition:</span></dt>
1374 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1375 the current thread owns the <code class="computeroutput"><span class="identifier">m</span></code>.
1377 <dt><span class="term">Throws:</span></dt>
1384 <div class="section">
1385 <div class="titlepage"><div><div><h5 class="title">
1386 <a name="thread.synchronization.mutex_concepts.lockable.is_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable" title="is_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a>
1387 </h5></div></div></div>
1388 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span>
1389 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1390 <span class="special">{</span>
1391 <span class="keyword">namespace</span> <span class="identifier">sync</span>
1392 <span class="special">{</span>
1393 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1394 <span class="keyword">class</span> <span class="identifier">is_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1395 <span class="special">}</span>
1396 <span class="special">}</span>
1399 Some of the algorithms on mutexes use this trait via SFINAE.
1402 This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements.
1404 <div class="warning"><table border="0" summary="Warning">
1406 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1407 <th align="left">Warning</th>
1409 <tr><td align="left" valign="top"><p>
1410 If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1411 to specialize this traits for the models of Lockable you could build.
1416 <div class="section">
1417 <div class="titlepage"><div><div><h4 class="title">
1418 <a name="thread.synchronization.mutex_concepts.recursive"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive" title="Recursive Lockable Concept">Recursive
1419 Lockable Concept</a>
1420 </h4></div></div></div>
1421 <div class="toc"><dl class="toc">
1422 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait --
1423 EXTENSION</a></span></dt>
1424 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait --
1425 EXTENSION</a></span></dt>
1426 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a></span></dt>
1429 The user could require that the mutex passed to an algorithm is a recursive
1430 one. Whether a lockable is recursive or not can not be checked using template
1431 meta-programming. This is the motivation for the following trait.
1433 <div class="section">
1434 <div class="titlepage"><div><div><h5 class="title">
1435 <a name="thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole" title="is_recursive_mutex_sur_parole trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait --
1437 </h5></div></div></div>
1438 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span>
1440 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1441 <span class="special">{</span>
1442 <span class="keyword">namespace</span> <span class="identifier">sync</span>
1443 <span class="special">{</span>
1444 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1445 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special">:</span> <span class="identifier">false_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1446 <span class="keyword">template</span><span class="special"><></span>
1447 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">>:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1448 <span class="keyword">template</span><span class="special"><></span>
1449 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special"><</span><span class="identifier">timed_recursive_mutex</span><span class="special">>:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1450 <span class="special">}</span>
1451 <span class="special">}</span>
1454 The trait <code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code>
1455 is <code class="computeroutput"><span class="identifier">false_type</span></code> by default
1456 and is specialized for the provide <code class="computeroutput"><span class="identifier">recursive_mutex</span></code>
1457 and <code class="computeroutput"><span class="identifier">timed_recursive_mutex</span></code>.
1460 It should be specialized by the user providing other model of recursive
1464 <div class="section">
1465 <div class="titlepage"><div><div><h5 class="title">
1466 <a name="thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable" title="is_recursive_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait --
1468 </h5></div></div></div>
1469 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span>
1470 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1471 <span class="special">{</span>
1472 <span class="keyword">namespace</span> <span class="identifier">sync</span>
1473 <span class="special">{</span>
1474 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1475 <span class="keyword">class</span> <span class="identifier">is_recursive_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1476 <span class="special">}</span>
1477 <span class="special">}</span>
1480 This traits is true_type if is_basic_lockable and is_recursive_mutex_sur_parole.
1483 <div class="section">
1484 <div class="titlepage"><div><div><h5 class="title">
1485 <a name="thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable" title="is_recursive_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a>
1486 </h5></div></div></div>
1487 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span>
1488 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1489 <span class="special">{</span>
1490 <span class="keyword">namespace</span> <span class="identifier">sync</span>
1491 <span class="special">{</span>
1492 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1493 <span class="keyword">class</span> <span class="identifier">is_recursive_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1494 <span class="special">}</span>
1495 <span class="special">}</span>
1498 This traits is true_type if is_lockable and is_recursive_mutex_sur_parole.
1502 <div class="section">
1503 <div class="titlepage"><div><div><h4 class="title">
1504 <a name="thread.synchronization.mutex_concepts.timed_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a>
1505 </h4></div></div></div>
1506 <div class="toc"><dl class="toc">
1507 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1508 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1509 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1510 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1512 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span>
1514 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1515 <span class="special">{</span>
1516 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1517 <span class="keyword">class</span> <span class="identifier">TimedLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1518 <span class="special">}</span>
1521 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> refines
1522 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to add support
1523 for timeouts when trying to acquire the lock.
1526 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements if
1527 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements and the
1528 following expressions are well-formed and have the specified semantics.
1531 <span class="bold"><strong>Variables:</strong></span>
1533 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1534 <li class="listitem">
1535 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1536 type <code class="computeroutput"><span class="identifier">L</span></code>,
1538 <li class="listitem">
1539 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1540 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1543 <li class="listitem">
1544 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1545 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1549 <span class="bold"><strong>Expressions:</strong></span>
1551 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1552 <li class="listitem">
1553 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1555 <li class="listitem">
1556 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1560 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> must be released
1561 through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a>.
1563 <div class="section">
1564 <div class="titlepage"><div><div><h5 class="title">
1565 <a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1566 </h5></div></div></div>
1567 <div class="variablelist">
1568 <p class="title"><b></b></p>
1569 <dl class="variablelist">
1570 <dt><span class="term">Requires:</span></dt>
1572 The calling thread doesn't owns the mutex if the mutex is not recursive.
1574 <dt><span class="term">Effects:</span></dt>
1576 Attempt to obtain ownership for the current thread. Blocks until
1577 ownership can be obtained, or the specified time is reached. If
1578 the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>.
1580 <dt><span class="term">Synchronization:</span></dt>
1582 If <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1583 operations on the same object synchronize with this operation.
1585 <dt><span class="term">Return type:</span></dt>
1587 <code class="computeroutput"><span class="keyword">bool</span></code>.
1589 <dt><span class="term">Returns:</span></dt>
1591 <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1592 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1595 <dt><span class="term">Postcondition:</span></dt>
1597 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1598 the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1600 <dt><span class="term">Throws:</span></dt>
1607 <div class="section">
1608 <div class="titlepage"><div><div><h5 class="title">
1609 <a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1610 </h5></div></div></div>
1611 <div class="variablelist">
1612 <p class="title"><b></b></p>
1613 <dl class="variablelist">
1614 <dt><span class="term">Requires:</span></dt>
1616 The calling thread doesn't owns the mutex if the mutex is not recursive.
1618 <dt><span class="term">Effects:</span></dt>
1620 As-if <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">rel_time</span><span class="special">)</span></code>.
1622 <dt><span class="term">Synchronization:</span></dt>
1624 If <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1625 operations on the same object synchronize with this operation.
1630 <div class="warning"><table border="0" summary="Warning">
1632 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1633 <th align="left">Warning</th>
1635 <tr><td align="left" valign="top">
1637 DEPRECATED since 4.00. The following expressions were required on version
1638 2, but are now deprecated.
1641 Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a>.
1646 <span class="bold"><strong>Variables:</strong></span>
1648 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1649 <li class="listitem">
1650 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1651 value of an instantiation of an unspecified <code class="computeroutput"><span class="identifier">DurationType</span></code>
1652 arithmetic compatible with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>,
1655 <li class="listitem">
1656 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1657 value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1661 <span class="bold"><strong>Expressions:</strong></span>
1663 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1664 <li class="listitem">
1665 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1667 <li class="listitem">
1668 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1672 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
1673 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1675 <div class="section">
1676 <div class="titlepage"><div><div><h5 class="title">
1677 <a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1678 </h5></div></div></div>
1679 <div class="variablelist">
1680 <p class="title"><b></b></p>
1681 <dl class="variablelist">
1682 <dt><span class="term">Effects:</span></dt>
1684 Attempt to obtain ownership for the current thread. Blocks until
1685 ownership can be obtained, or the specified time is reached. If
1686 the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>.
1688 <dt><span class="term">Returns:</span></dt>
1690 <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1691 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1694 <dt><span class="term">Postcondition:</span></dt>
1696 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1697 the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1699 <dt><span class="term">Throws:</span></dt>
1701 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1707 <div class="section">
1708 <div class="titlepage"><div><div><h5 class="title">
1709 <a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1710 </h5></div></div></div>
1711 <div class="variablelist">
1712 <p class="title"><b></b></p>
1713 <dl class="variablelist">
1714 <dt><span class="term">Effects:</span></dt>
1716 As-if <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()+</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>.
1722 <div class="section">
1723 <div class="titlepage"><div><div><h4 class="title">
1724 <a name="thread.synchronization.mutex_concepts.shared_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a>
1725 </h4></div></div></div>
1726 <div class="toc"><dl class="toc">
1727 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a></span></dt>
1728 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a></span></dt>
1729 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1730 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a></span></dt>
1731 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a></span></dt>
1732 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1734 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span>
1736 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1737 <span class="special">{</span>
1738 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
1739 <span class="keyword">class</span> <span class="identifier">SharedLockable</span><span class="special">;</span> <span class="comment">// C++14</span>
1740 <span class="special">}</span>
1743 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> is a refinement
1744 of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> that allows
1745 for <span class="emphasis"><em>shared ownership</em></span> as well as <span class="emphasis"><em>exclusive
1746 ownership</em></span>. This is the standard multiple-reader / single-write
1747 model: at most one thread can have exclusive ownership, and if any thread
1748 does have exclusive ownership, no other threads can have shared or exclusive
1749 ownership. Alternatively, many threads may have shared ownership.
1752 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements if
1753 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements and
1754 the following expressions are well-formed and have the specified semantics.
1757 <span class="bold"><strong>Variables:</strong></span>
1759 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1760 <li class="listitem">
1761 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1762 type <code class="computeroutput"><span class="identifier">L</span></code>,
1764 <li class="listitem">
1765 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1766 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1769 <li class="listitem">
1770 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1771 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1775 <span class="bold"><strong>Expressions:</strong></span>
1777 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1778 <li class="listitem">
1779 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code>
1781 <li class="listitem">
1782 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span></code></a><span class="special">()</span></code>
1784 <li class="listitem">
1785 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1787 <li class="listitem">
1788 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1790 <li class="listitem">
1791 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code>
1795 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
1796 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>,
1797 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a> must be
1798 released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
1800 <div class="section">
1801 <div class="titlepage"><div><div><h5 class="title">
1802 <a name="thread.synchronization.mutex_concepts.shared_lockable.lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>
1803 </h5></div></div></div>
1804 <div class="variablelist">
1805 <p class="title"><b></b></p>
1806 <dl class="variablelist">
1807 <dt><span class="term">Effects:</span></dt>
1809 The current thread blocks until shared ownership can be obtained
1810 for the current thread.
1812 <dt><span class="term">Postcondition:</span></dt>
1814 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1816 <dt><span class="term">Throws:</span></dt>
1818 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1824 <div class="section">
1825 <div class="titlepage"><div><div><h5 class="title">
1826 <a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
1827 </h5></div></div></div>
1828 <div class="variablelist">
1829 <p class="title"><b></b></p>
1830 <dl class="variablelist">
1831 <dt><span class="term">Effects:</span></dt>
1833 Attempt to obtain shared ownership for the current thread without
1836 <dt><span class="term">Returns:</span></dt>
1838 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1839 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1842 <dt><span class="term">Postcondition:</span></dt>
1844 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1845 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1847 <dt><span class="term">Throws:</span></dt>
1849 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1855 <div class="section">
1856 <div class="titlepage"><div><div><h5 class="title">
1857 <a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1858 </h5></div></div></div>
1859 <div class="variablelist">
1860 <p class="title"><b></b></p>
1861 <dl class="variablelist">
1862 <dt><span class="term">Effects:</span></dt>
1864 Attempt to obtain shared ownership for the current thread. Blocks
1865 until shared ownership can be obtained, or the specified duration
1866 is elapsed. If the specified duration is already elapsed, behaves
1867 as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1869 <dt><span class="term">Returns:</span></dt>
1871 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1872 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1875 <dt><span class="term">Postcondition:</span></dt>
1877 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1878 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1880 <dt><span class="term">Throws:</span></dt>
1882 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1888 <div class="section">
1889 <div class="titlepage"><div><div><h5 class="title">
1890 <a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a>
1891 </h5></div></div></div>
1892 <div class="variablelist">
1893 <p class="title"><b></b></p>
1894 <dl class="variablelist">
1895 <dt><span class="term">Effects:</span></dt>
1897 Attempt to obtain shared ownership for the current thread. Blocks
1898 until shared ownership can be obtained, or the specified time is
1899 reached. If the specified time has already passed, behaves as
1900 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1902 <dt><span class="term">Returns:</span></dt>
1904 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1905 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1908 <dt><span class="term">Postcondition:</span></dt>
1910 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1911 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1913 <dt><span class="term">Throws:</span></dt>
1915 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1921 <div class="section">
1922 <div class="titlepage"><div><div><h5 class="title">
1923 <a name="thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>
1924 </h5></div></div></div>
1925 <div class="variablelist">
1926 <p class="title"><b></b></p>
1927 <dl class="variablelist">
1928 <dt><span class="term">Precondition:</span></dt>
1930 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1932 <dt><span class="term">Effects:</span></dt>
1934 Releases shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>
1935 by the current thread.
1937 <dt><span class="term">Postcondition:</span></dt>
1939 The current thread no longer has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1941 <dt><span class="term">Throws:</span></dt>
1948 <div class="warning"><table border="0" summary="Warning">
1950 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1951 <th align="left">Warning</th>
1953 <tr><td align="left" valign="top">
1955 DEPRECATED since 3.00. The following expressions were required on version
1956 2, but are now deprecated.
1959 Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a>.
1964 <span class="bold"><strong>Variables:</strong></span>
1966 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1967 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1968 value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1971 <span class="bold"><strong>Expressions:</strong></span>
1973 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1974 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
1977 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
1978 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
1980 <div class="section">
1981 <div class="titlepage"><div><div><h5 class="title">
1982 <a name="thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1983 </h5></div></div></div>
1984 <div class="variablelist">
1985 <p class="title"><b></b></p>
1986 <dl class="variablelist">
1987 <dt><span class="term">Effects:</span></dt>
1989 Attempt to obtain shared ownership for the current thread. Blocks
1990 until shared ownership can be obtained, or the specified time is
1991 reached. If the specified time has already passed, behaves as
1992 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1994 <dt><span class="term">Returns:</span></dt>
1996 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1997 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2000 <dt><span class="term">Postcondition:</span></dt>
2002 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2003 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2005 <dt><span class="term">Throws:</span></dt>
2007 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2014 <div class="section">
2015 <div class="titlepage"><div><div><h4 class="title">
2016 <a name="thread.synchronization.mutex_concepts.upgrade_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a>
2017 </h4></div></div></div>
2018 <div class="toc"><dl class="toc">
2019 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2020 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a></span></dt>
2021 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2022 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2023 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2024 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a></span></dt>
2025 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2026 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2027 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a></span></dt>
2028 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2029 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2030 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2031 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2032 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt>
2033 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt>
2034 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2035 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2036 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a></span></dt>
2038 <pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span>
2040 <span class="keyword">namespace</span> <span class="identifier">boost</span>
2041 <span class="special">{</span>
2042 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span>
2043 <span class="keyword">class</span> <span class="identifier">UpgradeLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
2044 <span class="special">}</span>
2047 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> is a refinement
2048 of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> that allows
2049 for <span class="emphasis"><em>upgradable ownership</em></span> as well as <span class="emphasis"><em>shared
2050 ownership</em></span> and <span class="emphasis"><em>exclusive ownership</em></span>. This
2051 is an extension to the multiple-reader / single-write model provided by
2052 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>: a single
2053 thread may have <span class="emphasis"><em>upgradable ownership</em></span> at the same time
2054 as others have <span class="emphasis"><em>shared ownership</em></span>. The thread with
2055 <span class="emphasis"><em>upgradable ownership</em></span> may at any time attempt to upgrade
2056 that ownership to <span class="emphasis"><em>exclusive ownership</em></span>. If no other
2057 threads have shared ownership, the upgrade is completed immediately, and
2058 the thread now has <span class="emphasis"><em>exclusive ownership</em></span>, which must
2059 be relinquished by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>,
2060 just as if it had been acquired by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>.
2063 If a thread with <span class="emphasis"><em>upgradable ownership</em></span> tries to upgrade
2064 whilst other threads have <span class="emphasis"><em>shared ownership</em></span>, the attempt
2065 will fail and the thread will block until <span class="emphasis"><em>exclusive ownership</em></span>
2069 Ownership can also be <span class="emphasis"><em>downgraded</em></span> as well as <span class="emphasis"><em>upgraded</em></span>:
2070 exclusive ownership of an implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> can be
2071 downgraded to upgradable ownership or shared ownership, and upgradable
2072 ownership can be downgraded to plain shared ownership.
2075 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> requirements if
2076 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements and
2077 the following expressions are well-formed and have the specified semantics.
2080 <span class="bold"><strong>Variables:</strong></span>
2082 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2083 <li class="listitem">
2084 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
2085 type <code class="computeroutput"><span class="identifier">L</span></code>,
2087 <li class="listitem">
2088 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
2089 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
2092 <li class="listitem">
2093 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
2094 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
2098 <span class="bold"><strong>Expressions:</strong></span>
2100 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2101 <li class="listitem">
2102 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span></code></a><span class="special">();</span></code>
2104 <li class="listitem">
2105 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code>
2107 <li class="listitem">
2108 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>
2110 <li class="listitem">
2111 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
2113 <li class="listitem">
2114 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
2116 <li class="listitem">
2117 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_and_lock_shared</span></code></a><span class="special">()</span></code>
2119 <li class="listitem">
2120 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_and_lock_upgrade</span></code></a><span class="special">();</span></code>
2122 <li class="listitem">
2123 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock</span></code></a><span class="special">();</span></code>
2125 <li class="listitem">
2126 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>
2128 <li class="listitem">
2129 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
2131 <li class="listitem">
2132 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
2134 <li class="listitem">
2135 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock_shared</span></code></a><span class="special">();</span></code>
2139 If `BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION is defined the
2140 following expressions are also required:
2142 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2143 <li class="listitem">
2144 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">();</span></code>
2146 <li class="listitem">
2147 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code>
2149 <li class="listitem">
2150 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
2152 <li class="listitem">
2153 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">();</span></code>
2155 <li class="listitem">
2156 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code>
2158 <li class="listitem">
2159 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
2163 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a>
2164 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>.
2165 If the ownership type is changed through a call to one of the <code class="computeroutput"><span class="identifier">unlock_xxx_and_lock_yyy</span><span class="special">()</span></code>
2166 functions, ownership must be released through a call to the unlock function
2167 corresponding to the new level of ownership.
2169 <div class="section">
2170 <div class="titlepage"><div><div><h5 class="title">
2171 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a>
2172 </h5></div></div></div>
2173 <div class="variablelist">
2174 <p class="title"><b></b></p>
2175 <dl class="variablelist">
2176 <dt><span class="term">Precondition:</span></dt>
2178 The calling thread has no ownership of the mutex.
2180 <dt><span class="term">Effects:</span></dt>
2182 The current thread blocks until upgrade ownership can be obtained
2183 for the current thread.
2185 <dt><span class="term">Postcondition:</span></dt>
2187 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2189 <dt><span class="term">Synchronization:</span></dt>
2191 Prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2192 synchronize with this operation.
2194 <dt><span class="term">Throws:</span></dt>
2196 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2202 <div class="section">
2203 <div class="titlepage"><div><div><h5 class="title">
2204 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>
2205 </h5></div></div></div>
2206 <div class="variablelist">
2207 <p class="title"><b></b></p>
2208 <dl class="variablelist">
2209 <dt><span class="term">Precondition:</span></dt>
2211 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2213 <dt><span class="term">Effects:</span></dt>
2215 Releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2216 by the current thread.
2218 <dt><span class="term">Postcondition:</span></dt>
2220 The current thread no longer has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2222 <dt><span class="term">Synchronization:</span></dt>
2224 This operation synchronizes with subsequent lock operations that
2225 obtain ownership on the same object.
2227 <dt><span class="term">Throws:</span></dt>
2234 <div class="section">
2235 <div class="titlepage"><div><div><h5 class="title">
2236 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a>
2237 </h5></div></div></div>
2238 <div class="variablelist">
2239 <p class="title"><b></b></p>
2240 <dl class="variablelist">
2241 <dt><span class="term">Precondition:</span></dt>
2243 The calling thread has no ownership of the mutex.
2245 <dt><span class="term">Effects:</span></dt>
2247 Attempts to obtain upgrade ownership of the mutex for the calling
2248 thread without blocking. If upgrade ownership is not obtained,
2249 there is no effect and try_lock_upgrade() immediately returns.
2251 <dt><span class="term">Returns:</span></dt>
2253 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2254 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2257 <dt><span class="term">Postcondition:</span></dt>
2259 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2260 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2262 <dt><span class="term">Synchronization:</span></dt>
2264 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2265 synchronize with this operation.
2267 <dt><span class="term">Throws:</span></dt>
2274 <div class="section">
2275 <div class="titlepage"><div><div><h5 class="title">
2276 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2277 </h5></div></div></div>
2278 <div class="variablelist">
2279 <p class="title"><b></b></p>
2280 <dl class="variablelist">
2281 <dt><span class="term">Precondition:</span></dt>
2283 The calling thread has no ownership of the mutex.
2285 <dt><span class="term">Effects:</span></dt>
2287 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2288 is not exactly convertible to the native tick period, the duration
2289 shall be rounded up to the nearest native tick period. Attempts
2290 to obtain upgrade lock ownership for the calling thread within
2291 the relative timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>.
2292 If the time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2293 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2294 ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns within
2295 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2296 only if it has obtained upgrade ownership of the mutex object.
2298 <dt><span class="term">Returns:</span></dt>
2300 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2301 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2304 <dt><span class="term">Postcondition:</span></dt>
2306 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2307 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2309 <dt><span class="term">Synchronization:</span></dt>
2311 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2312 synchronize with this operation.
2314 <dt><span class="term">Throws:</span></dt>
2318 <dt><span class="term">Notes:</span></dt>
2320 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2321 is defined on Windows platform
2326 <div class="section">
2327 <div class="titlepage"><div><div><h5 class="title">
2328 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2329 </h5></div></div></div>
2330 <div class="variablelist">
2331 <p class="title"><b></b></p>
2332 <dl class="variablelist">
2333 <dt><span class="term">Precondition:</span></dt>
2335 The calling thread has no ownership of the mutex.
2337 <dt><span class="term">Effects:</span></dt>
2339 The function attempts to obtain upgrade ownership of the mutex.
2340 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2341 already passed, the function attempts to obtain upgrade ownership
2342 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns before
2343 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2344 only if it has obtained upgrade ownership of the mutex object.
2346 <dt><span class="term">Returns:</span></dt>
2348 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2349 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2352 <dt><span class="term">Postcondition:</span></dt>
2354 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2355 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2357 <dt><span class="term">Synchronization:</span></dt>
2359 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2360 synchronize with this operation.
2362 <dt><span class="term">Throws:</span></dt>
2366 <dt><span class="term">Notes:</span></dt>
2368 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2369 is defined on Windows platform
2374 <div class="section">
2375 <div class="titlepage"><div><div><h5 class="title">
2376 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a>
2377 </h5></div></div></div>
2378 <div class="variablelist">
2379 <p class="title"><b></b></p>
2380 <dl class="variablelist">
2381 <dt><span class="term">Precondition:</span></dt>
2383 The calling thread must hold a shared lock on the mutex.
2385 <dt><span class="term">Effects:</span></dt>
2387 The function attempts to atomically convert the ownership from
2388 shared to exclusive for the calling thread without blocking. For
2389 this conversion to be successful, this thread must be the only
2390 thread holding any ownership of the lock. If the conversion is
2391 not successful, the shared ownership of m is retained.
2393 <dt><span class="term">Returns:</span></dt>
2395 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2396 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2399 <dt><span class="term">Postcondition:</span></dt>
2401 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2402 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2404 <dt><span class="term">Synchronization:</span></dt>
2406 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2407 and subsequent lock operations on the same object synchronize with
2410 <dt><span class="term">Throws:</span></dt>
2414 <dt><span class="term">Notes:</span></dt>
2416 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2417 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2418 is defined on Windows platform
2423 <div class="section">
2424 <div class="titlepage"><div><div><h5 class="title">
2425 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2426 </h5></div></div></div>
2427 <div class="variablelist">
2428 <p class="title"><b></b></p>
2429 <dl class="variablelist">
2430 <dt><span class="term">Precondition:</span></dt>
2432 The calling thread shall hold a shared lock on the mutex.
2434 <dt><span class="term">Effects:</span></dt>
2436 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2437 is not exactly convertible to the native tick period, the duration
2438 shall be rounded up to the nearest native tick period. The function
2439 attempts to atomically convert the ownership from shared to exclusive
2440 for the calling thread within the relative timeout specified by
2441 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2442 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2443 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2444 exclusive ownership without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>).
2445 The function shall return within the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> only if it has obtained
2446 exclusive ownership of the mutex object. For this conversion to
2447 be successful, this thread must be the only thread holding any
2448 ownership of the lock at the moment of conversion. If the conversion
2449 is not successful, the shared ownership of the mutex is retained.
2451 <dt><span class="term">Returns:</span></dt>
2453 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2454 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2457 <dt><span class="term">Postcondition:</span></dt>
2459 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2460 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2462 <dt><span class="term">Synchronization:</span></dt>
2464 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2465 and subsequent lock operations on the same object synchronize with
2468 <dt><span class="term">Throws:</span></dt>
2472 <dt><span class="term">Notes:</span></dt>
2474 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2475 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2476 is defined on Windows platform
2481 <div class="section">
2482 <div class="titlepage"><div><div><h5 class="title">
2483 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2484 </h5></div></div></div>
2485 <div class="variablelist">
2486 <p class="title"><b></b></p>
2487 <dl class="variablelist">
2488 <dt><span class="term">Precondition:</span></dt>
2490 The calling thread shall hold a shared lock on the mutex.
2492 <dt><span class="term">Effects:</span></dt>
2494 The function attempts to atomically convert the ownership from
2495 shared to exclusive for the calling thread within the absolute
2496 timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2497 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2498 already passed, the function attempts to obtain exclusive ownership
2499 without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>). The function shall return before
2500 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2501 only if it has obtained exclusive ownership of the mutex object.
2502 For this conversion to be successful, this thread must be the only
2503 thread holding any ownership of the lock at the moment of conversion.
2504 If the conversion is not successful, the shared ownership of the
2507 <dt><span class="term">Returns:</span></dt>
2509 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2510 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2513 <dt><span class="term">Postcondition:</span></dt>
2515 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2516 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2518 <dt><span class="term">Synchronization:</span></dt>
2520 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2521 and subsequent lock operations on the same object synchronize with
2524 <dt><span class="term">Throws:</span></dt>
2528 <dt><span class="term">Notes:</span></dt>
2530 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2531 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2532 is defined on Windows platform
2537 <div class="section">
2538 <div class="titlepage"><div><div><h5 class="title">
2539 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a>
2540 </h5></div></div></div>
2541 <div class="variablelist">
2542 <p class="title"><b></b></p>
2543 <dl class="variablelist">
2544 <dt><span class="term">Precondition:</span></dt>
2546 The calling thread shall hold an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
2548 <dt><span class="term">Effects:</span></dt>
2550 Atomically converts the ownership from exclusive to shared for
2553 <dt><span class="term">Postcondition:</span></dt>
2555 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2557 <dt><span class="term">Synchronization:</span></dt>
2559 This operation synchronizes with subsequent lock operations that
2560 obtain ownership of the same object.
2562 <dt><span class="term">Throws:</span></dt>
2569 <div class="section">
2570 <div class="titlepage"><div><div><h5 class="title">
2571 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a>
2572 </h5></div></div></div>
2573 <div class="variablelist">
2574 <p class="title"><b></b></p>
2575 <dl class="variablelist">
2576 <dt><span class="term">Precondition:</span></dt>
2578 The calling thread shall hold a shared lock on the mutex.
2580 <dt><span class="term">Effects:</span></dt>
2582 The function attempts to atomically convert the ownership from
2583 shared to upgrade for the calling thread without blocking. For
2584 this conversion to be successful, there must be no thread holding
2585 upgrade ownership of this object. If the conversion is not successful,
2586 the shared ownership of the mutex is retained.
2588 <dt><span class="term">Returns:</span></dt>
2590 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2591 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2594 <dt><span class="term">Postcondition:</span></dt>
2596 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2597 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2599 <dt><span class="term">Synchronization:</span></dt>
2601 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2602 on the same object synchronize with this operation.
2604 <dt><span class="term">Throws:</span></dt>
2608 <dt><span class="term">Notes:</span></dt>
2610 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2611 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2612 is defined on Windows platform
2617 <div class="section">
2618 <div class="titlepage"><div><div><h5 class="title">
2619 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2620 </h5></div></div></div>
2621 <div class="variablelist">
2622 <p class="title"><b></b></p>
2623 <dl class="variablelist">
2624 <dt><span class="term">Precondition:</span></dt>
2626 The calling thread shall hold a shared lock on the mutex.
2628 <dt><span class="term">Effects:</span></dt>
2630 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2631 is not exactly convertible to the native tick period, the duration
2632 shall be rounded up to the nearest native tick period. The function
2633 attempts to atomically convert the ownership from shared to upgrade
2634 for the calling thread within the relative timeout specified by
2635 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2636 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2637 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2638 upgrade ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return within
2639 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2640 only if it has obtained exclusive ownership of the mutex object.
2641 For this conversion to be successful, there must be no thread holding
2642 upgrade ownership of this object at the moment of conversion. If
2643 the conversion is not successful, the shared ownership of m is
2646 <dt><span class="term">Returns:</span></dt>
2648 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2649 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2652 <dt><span class="term">Postcondition:</span></dt>
2654 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2655 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2657 <dt><span class="term">Synchronization:</span></dt>
2659 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2660 on the same object synchronize with this operation.
2662 <dt><span class="term">Throws:</span></dt>
2666 <dt><span class="term">Notes:</span></dt>
2668 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2669 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2670 is defined on Windows platform
2675 <div class="section">
2676 <div class="titlepage"><div><div><h5 class="title">
2677 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2678 </h5></div></div></div>
2679 <div class="variablelist">
2680 <p class="title"><b></b></p>
2681 <dl class="variablelist">
2682 <dt><span class="term">Precondition:</span></dt>
2684 The calling thread shall hold a shared lock on the mutex.
2686 <dt><span class="term">Effects:</span></dt>
2688 The function attempts to atomically convert the ownership from
2689 shared to upgrade for the calling thread within the absolute timeout
2690 specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2691 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2692 already passed, the function attempts to obtain upgrade ownership
2693 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return before
2694 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2695 only if it has obtained upgrade ownership of the mutex object.
2696 For this conversion to be successful, there must be no thread holding
2697 upgrade ownership of this object at the moment of conversion. If
2698 the conversion is not successful, the shared ownership of the mutex
2701 <dt><span class="term">Returns:</span></dt>
2703 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2704 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2707 <dt><span class="term">Postcondition:</span></dt>
2709 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2710 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2712 <dt><span class="term">Synchronization:</span></dt>
2714 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2715 on the same object synchronize with this operation.
2717 <dt><span class="term">Throws:</span></dt>
2721 <dt><span class="term">Notes:</span></dt>
2723 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2724 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2725 is defined on Windows platform
2730 <div class="section">
2731 <div class="titlepage"><div><div><h5 class="title">
2732 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a>
2733 </h5></div></div></div>
2734 <div class="variablelist">
2735 <p class="title"><b></b></p>
2736 <dl class="variablelist">
2737 <dt><span class="term">Precondition:</span></dt>
2739 The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2741 <dt><span class="term">Effects:</span></dt>
2743 Atomically releases exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2744 by the current thread and acquires upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2746 <dt><span class="term">Postcondition:</span></dt>
2748 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2750 <dt><span class="term">Synchronization:</span></dt>
2752 This operation synchronizes with subsequent lock operations that
2753 obtain ownership of the same object.
2755 <dt><span class="term">Throws:</span></dt>
2762 <div class="section">
2763 <div class="titlepage"><div><div><h5 class="title">
2764 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a>
2765 </h5></div></div></div>
2766 <div class="variablelist">
2767 <p class="title"><b></b></p>
2768 <dl class="variablelist">
2769 <dt><span class="term">Precondition:</span></dt>
2771 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2773 <dt><span class="term">Effects:</span></dt>
2775 Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2776 by the current thread and acquires exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. If any other threads have
2777 shared ownership, blocks until exclusive ownership can be acquired.
2779 <dt><span class="term">Postcondition:</span></dt>
2781 The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2783 <dt><span class="term">Synchronization:</span></dt>
2785 This operation synchronizes with prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> and subsequent lock operations
2786 that obtain ownership of the same object.
2788 <dt><span class="term">Throws:</span></dt>
2795 <div class="section">
2796 <div class="titlepage"><div><div><h5 class="title">
2797 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a>
2798 </h5></div></div></div>
2799 <div class="variablelist">
2800 <p class="title"><b></b></p>
2801 <dl class="variablelist">
2802 <dt><span class="term">Precondition:</span></dt>
2804 The calling thread shall hold a upgrade lock on the mutex.
2806 <dt><span class="term">Effects:</span></dt>
2808 The function attempts to atomically convert the ownership from
2809 upgrade to exclusive for the calling thread without blocking. For
2810 this conversion to be successful, this thread must be the only
2811 thread holding any ownership of the lock. If the conversion is
2812 not successful, the upgrade ownership of m is retained.
2814 <dt><span class="term">Returns:</span></dt>
2816 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2817 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2820 <dt><span class="term">Postcondition:</span></dt>
2822 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2823 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2825 <dt><span class="term">Synchronization:</span></dt>
2827 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2828 and subsequent lock operations on the same object synchronize with
2831 <dt><span class="term">Throws:</span></dt>
2835 <dt><span class="term">Notes:</span></dt>
2837 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2838 is defined on Windows platform
2843 <div class="section">
2844 <div class="titlepage"><div><div><h5 class="title">
2845 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2846 </h5></div></div></div>
2847 <div class="variablelist">
2848 <p class="title"><b></b></p>
2849 <dl class="variablelist">
2850 <dt><span class="term">Precondition:</span></dt>
2852 The calling thread shall hold a upgrade lock on the mutex.
2854 <dt><span class="term">Effects:</span></dt>
2856 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2857 is not exactly convertible to the native tick period, the duration
2858 shall be rounded up to the nearest native tick period. The function
2859 attempts to atomically convert the ownership from upgrade to exclusive
2860 for the calling thread within the relative timeout specified by
2861 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2862 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2863 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2864 exclusive ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return within
2865 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2866 only if it has obtained exclusive ownership of the mutex object.
2867 For this conversion to be successful, this thread shall be the
2868 only thread holding any ownership of the lock at the moment of
2869 conversion. If the conversion is not successful, the upgrade ownership
2872 <dt><span class="term">Returns:</span></dt>
2874 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2875 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2878 <dt><span class="term">Postcondition:</span></dt>
2880 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2881 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2883 <dt><span class="term">Synchronization:</span></dt>
2885 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2886 and subsequent lock operations on the same object synchronize with
2889 <dt><span class="term">Throws:</span></dt>
2893 <dt><span class="term">Notes:</span></dt>
2895 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2896 is defined on Windows platform
2901 <div class="section">
2902 <div class="titlepage"><div><div><h5 class="title">
2903 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2904 </h5></div></div></div>
2905 <div class="variablelist">
2906 <p class="title"><b></b></p>
2907 <dl class="variablelist">
2908 <dt><span class="term">Precondition:</span></dt>
2910 The calling thread shall hold a upgrade lock on the mutex.
2912 <dt><span class="term">Effects:</span></dt>
2914 The function attempts to atomically convert the ownership from
2915 upgrade to exclusive for the calling thread within the absolute
2916 timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2917 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2918 already passed, the function attempts to obtain exclusive ownership
2919 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return before
2920 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2921 only if it has obtained exclusive ownership of the mutex object.
2922 For this conversion to be successful, this thread shall be the
2923 only thread holding any ownership of the lock at the moment of
2924 conversion. If the conversion is not successful, the upgrade ownership
2927 <dt><span class="term">Returns:</span></dt>
2929 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2930 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2933 <dt><span class="term">Postcondition:</span></dt>
2935 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2936 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2938 <dt><span class="term">Synchronization:</span></dt>
2940 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2941 and subsequent lock operations on the same object synchronize with
2944 <dt><span class="term">Throws:</span></dt>
2948 <dt><span class="term">Notes:</span></dt>
2950 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2951 is defined on Windows platform
2956 <div class="section">
2957 <div class="titlepage"><div><div><h5 class="title">
2958 <a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a>
2959 </h5></div></div></div>
2960 <div class="variablelist">
2961 <p class="title"><b></b></p>
2962 <dl class="variablelist">
2963 <dt><span class="term">Precondition:</span></dt>
2965 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2967 <dt><span class="term">Effects:</span></dt>
2969 Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2970 by the current thread and acquires shared ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2972 <dt><span class="term">Postcondition:</span></dt>
2974 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2976 <dt><span class="term">Synchronization:</span></dt>
2978 This operation synchronizes with prior <code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code> and subsequent lock operations
2979 that obtain ownership of the same object.
2981 <dt><span class="term">Throws:</span></dt>
2990 <div class="section">
2991 <div class="titlepage"><div><div><h3 class="title">
2992 <a name="thread.synchronization.lock_option"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option" title="Lock Options">Lock Options</a>
2993 </h3></div></div></div>
2994 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option.lock_tags">Lock
2995 option tags</a></span></dt></dl></div>
2996 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span>
2997 <span class="comment">// #include <boost/thread/locks_options.hpp> </span>
2999 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3000 <span class="special">{</span>
3001 <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3002 <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3003 <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3004 <span class="keyword">constexpr</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3005 <span class="keyword">constexpr</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3006 <span class="keyword">constexpr</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3008 <div class="section">
3009 <div class="titlepage"><div><div><h4 class="title">
3010 <a name="thread.synchronization.lock_option.lock_tags"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option.lock_tags" title="Lock option tags">Lock
3012 </h4></div></div></div>
3013 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">locks</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
3014 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">locks_options</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
3016 <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3017 <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3018 <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3019 <span class="keyword">const</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3020 <span class="keyword">const</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3021 <span class="keyword">const</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3024 These tags are used in scoped locks constructors to specify a specific
3027 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3028 <li class="listitem">
3029 <code class="computeroutput"><span class="identifier">defer_lock_t</span></code>: is used
3030 to construct the scoped lock without locking it.
3032 <li class="listitem">
3033 <code class="computeroutput"><span class="identifier">try_to_lock_t</span></code>: is used
3034 to construct the scoped lock trying to lock it.
3036 <li class="listitem">
3037 <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>: is used
3038 to construct the scoped lock without locking it but adopting ownership.
3043 <div class="section">
3044 <div class="titlepage"><div><div><h3 class="title">
3045 <a name="thread.synchronization.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard" title="Lock Guard">Lock Guard</a>
3046 </h3></div></div></div>
3047 <div class="toc"><dl class="toc">
3048 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard">Class
3049 template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a></span></dt>
3050 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard">Non
3051 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3052 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt">Non
3053 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3055 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span>
3056 <span class="comment">// #include <boost/thread/lock_guard.hpp> </span>
3058 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3059 <span class="special">{</span>
3061 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3062 <span class="keyword">class</span> <span class="identifier">lock_guard</span>
3063 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_LOCK_GUARD</span>
3064 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3065 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3066 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3067 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3068 <span class="preprocessor">#endif</span>
3069 <span class="special">}</span>
3071 <div class="section">
3072 <div class="titlepage"><div><div><h4 class="title">
3073 <a name="thread.synchronization.lock_guard.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard">Class
3074 template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a>
3075 </h4></div></div></div>
3076 <div class="toc"><dl class="toc">
3077 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3078 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3079 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3080 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
3081 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a></span></dt>
3083 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
3084 <span class="comment">// #include <boost/thread/lock_guard.hpp> </span>
3086 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3087 <span class="keyword">class</span> <span class="identifier">lock_guard</span>
3088 <span class="special">{</span>
3089 <span class="keyword">public</span><span class="special">:</span>
3090 <span class="keyword">explicit</span> <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
3091 <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</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 <span class="special">~</span><span class="identifier">lock_guard</span><span class="special">();</span>
3094 <span class="special">};</span>
3097 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> is very simple: on
3098 construction it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> supplied as the
3099 constructor parameter. On destruction, the ownership is released. This
3100 provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, to facilitate
3101 exception-safe locking and unlocking. In addition, the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3102 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code>
3103 constructor</a> allows the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> object to take ownership
3104 of a lock already held by the current thread.
3106 <div class="section">
3107 <div class="titlepage"><div><div><h5 class="title">
3108 <a name="thread.synchronization.lock_guard.lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor" title="lock_guard(Lockable & m)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3109 <span class="identifier">m</span><span class="special">)</span></code></a>
3110 </h5></div></div></div>
3111 <div class="variablelist">
3112 <p class="title"><b></b></p>
3113 <dl class="variablelist">
3114 <dt><span class="term">Effects:</span></dt>
3116 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3117 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3119 <dt><span class="term">Throws:</span></dt>
3121 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3126 <div class="section">
3127 <div class="titlepage"><div><div><h5 class="title">
3128 <a name="thread.synchronization.lock_guard.lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3129 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
3130 </h5></div></div></div>
3131 <div class="variablelist">
3132 <p class="title"><b></b></p>
3133 <dl class="variablelist">
3134 <dt><span class="term">Precondition:</span></dt>
3136 The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
3137 equivalent to one obtained by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3139 <dt><span class="term">Effects:</span></dt>
3141 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3142 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3144 <dt><span class="term">Throws:</span></dt>
3151 <div class="section">
3152 <div class="titlepage"><div><div><h5 class="title">
3153 <a name="thread.synchronization.lock_guard.lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor" title="~lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a>
3154 </h5></div></div></div>
3155 <div class="variablelist">
3156 <p class="title"><b></b></p>
3157 <dl class="variablelist">
3158 <dt><span class="term">Effects:</span></dt>
3160 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
3161 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
3164 <dt><span class="term">Throws:</span></dt>
3172 <div class="section">
3173 <div class="titlepage"><div><div><h4 class="title">
3174 <a name="thread.synchronization.lock_guard.make_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard" title="Non Member Function make_lock_guard">Non
3175 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3176 </h4></div></div></div>
3177 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3178 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3180 <div class="variablelist">
3181 <p class="title"><b></b></p>
3182 <dl class="variablelist">
3183 <dt><span class="term">Returns:</span></dt>
3185 a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
3187 <dt><span class="term">Throws:</span></dt>
3189 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3194 <div class="section">
3195 <div class="titlepage"><div><div><h4 class="title">
3196 <a name="thread.synchronization.lock_guard.make_lock_guard_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt" title="Non Member Function make_lock_guard">Non
3197 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3198 </h4></div></div></div>
3199 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3200 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3202 <div class="variablelist">
3203 <p class="title"><b></b></p>
3204 <dl class="variablelist">
3205 <dt><span class="term">Returns:</span></dt>
3207 a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock</span><span class="special">}</span></code>.
3209 <dt><span class="term">Throws:</span></dt>
3211 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3217 <div class="section">
3218 <div class="titlepage"><div><div><h3 class="title">
3219 <a name="thread.synchronization.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard" title="With Lock Guard">With Lock Guard</a>
3220 </h3></div></div></div>
3221 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard">Non
3222 Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a></span></dt></dl></div>
3223 <pre class="programlisting"><span class="comment">// #include <boost/thread/with_lock_guard.hpp></span>
3225 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3226 <span class="special">{</span>
3227 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
3228 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...));</span>
3229 <span class="special">}</span>
3231 <div class="section">
3232 <div class="titlepage"><div><div><h4 class="title">
3233 <a name="thread.synchronization.with_lock_guard.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard" title="Non Member Function with_lock_guard">Non
3234 Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a>
3235 </h4></div></div></div>
3236 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
3237 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
3238 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span>
3239 <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span>
3240 <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span>
3241 <span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...));</span>
3243 <div class="variablelist">
3244 <p class="title"><b></b></p>
3245 <dl class="variablelist">
3246 <dt><span class="term">Precondition:</span></dt>
3248 <code class="computeroutput"><span class="identifier">m</span></code> must be in unlocked
3251 <dt><span class="term">Effects:</span></dt>
3253 call <code class="computeroutput"><span class="identifier">func</span></code> in scope
3254 locked by <code class="computeroutput"><span class="identifier">m</span></code>
3256 <dt><span class="term">Returns:</span></dt>
3258 Result of <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3261 <dt><span class="term">Throws:</span></dt>
3263 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span></code>
3264 and <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3266 <dt><span class="term">Postcondition:</span></dt>
3268 <code class="computeroutput"><span class="identifier">m</span></code> is in unlocked
3271 <dt><span class="term">Limitations:</span></dt>
3273 Without c++11 variadic templates support number of arguments is limited
3274 to <code class="computeroutput"><span class="number">4</span></code>
3276 <dt><span class="term"></span></dt>
3278 Without rvalue references support calling class method with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code> must be const
3280 <dt><span class="term"></span></dt>
3282 For correct work with lambda macro <code class="computeroutput"><span class="identifier">BOOST_RESULT_OF_USE_DECLTYPE</span></code>
3283 may be needed to define
3289 <div class="section">
3290 <div class="titlepage"><div><div><h3 class="title">
3291 <a name="thread.synchronization.lock_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts" title="Lock Concepts">Lock Concepts</a>
3292 </h3></div></div></div>
3293 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock">StrictLock
3294 -- EXTENSION</a></span></dt></dl></div>
3295 <div class="section">
3296 <div class="titlepage"><div><div><h4 class="title">
3297 <a name="thread.synchronization.lock_concepts.StrictLock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION">StrictLock
3299 </h4></div></div></div>
3300 <div class="toc"><dl class="toc">
3301 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a></span></dt>
3302 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code></a></span></dt>
3303 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a></span></dt>
3304 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models">Models</a></span></dt>
3306 <pre class="programlisting"><span class="comment">// #include <boost/thread/lock_concepts.hpp> </span>
3308 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3309 <span class="special">{</span>
3311 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
3312 <span class="keyword">class</span> <span class="identifier">StrictLock</span><span class="special">;</span>
3313 <span class="special">}</span>
3316 A StrictLock is a lock that ensures that the associated mutex is locked
3317 during the lifetime of the lock.
3320 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the StrictLock
3321 requirements if the following expressions are well-formed and have the
3324 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3325 <li class="listitem">
3326 <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code>
3328 <li class="listitem">
3329 <code class="computeroutput"><span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code>
3331 <li class="listitem">
3332 <code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code>
3336 and BasicLockable<L::mutex_type>
3341 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3342 <li class="listitem">
3343 <code class="computeroutput"><span class="identifier">cl</span></code> denotes a value
3344 of type <code class="computeroutput"><span class="identifier">L</span> <span class="keyword">const</span><span class="special">&</span></code>,
3346 <li class="listitem">
3347 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
3348 type <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span></code>,
3351 <div class="section">
3352 <div class="titlepage"><div><div><h5 class="title">
3353 <a name="thread.synchronization.lock_concepts.StrictLock.mutex_type"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type" title="L::mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a>
3354 </h5></div></div></div>
3356 The type L::mutex_type denotes the mutex that is locked by this lock.
3359 <div class="section">
3360 <div class="titlepage"><div><div><h5 class="title">
3361 <a name="thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole" title="is_strict_lock_sur_parole<L>"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code></a>
3362 </h5></div></div></div>
3364 As the semantic "ensures that the associated mutex is locked during
3365 the lifetime of the lock. " can not be described by syntactic requirements
3366 a <code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span></code>
3367 trait must be specialized by the user defining the lock so that the following
3370 <pre class="programlisting"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">>::</span><span class="identifier">value</span> <span class="special">==</span> <span class="keyword">true</span>
3373 <div class="section">
3374 <div class="titlepage"><div><div><h5 class="title">
3375 <a name="thread.synchronization.lock_concepts.StrictLock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock" title="cl.owns_lock(m);"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a>
3376 </h5></div></div></div>
3377 <div class="variablelist">
3378 <p class="title"><b></b></p>
3379 <dl class="variablelist">
3380 <dt><span class="term">Return Type:</span></dt>
3382 <code class="computeroutput"><span class="keyword">bool</span></code>
3384 <dt><span class="term">Returns:</span></dt>
3386 Whether the strict lock is locking the mutex <code class="computeroutput"><span class="identifier">m</span></code>
3388 <dt><span class="term">Throws:</span></dt>
3395 <div class="section">
3396 <div class="titlepage"><div><div><h5 class="title">
3397 <a name="thread.synchronization.lock_concepts.StrictLock.models"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models" title="Models">Models</a>
3398 </h5></div></div></div>
3400 The following classes are models of <code class="computeroutput"><span class="identifier">StrictLock</span></code>:
3402 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3403 <li class="listitem">
3404 strict_lock: ensured by construction,
3406 <li class="listitem">
3407 nested_strict_lock: "sur parole" as the user could use
3408 adopt_lock_t on unique_lock constructor overload without having locked
3411 <li class="listitem">
3412 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: "sur parole"
3413 as the user could use adopt_lock_t constructor overload without having
3420 <div class="section">
3421 <div class="titlepage"><div><div><h3 class="title">
3422 <a name="thread.synchronization.locks"></a><a class="link" href="synchronization.html#thread.synchronization.locks" title="Lock Types">Lock Types</a>
3423 </h3></div></div></div>
3424 <div class="toc"><dl class="toc">
3425 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock">Class template
3426 <code class="computeroutput"><span class="identifier">unique_lock</span></code></a></span></dt>
3427 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock">Class template
3428 <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a></span></dt>
3429 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_lock">Class template
3430 <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a></span></dt>
3431 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock">Class
3432 template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
3433 -- EXTENSION</a></span></dt>
3434 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.scoped_try_lock">Mutex-specific
3435 class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
3436 DEPRECATED</a></span></dt>
3438 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span>
3439 <span class="comment">// #include <boost/thread/lock_types.hpp> </span>
3441 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3442 <span class="special">{</span>
3444 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3445 <span class="keyword">class</span> <span class="identifier">unique_lock</span><span class="special">;</span>
3446 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span>
3447 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">unique_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span>
3448 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3449 <span class="keyword">class</span> <span class="identifier">shared_lock</span><span class="special">;</span> <span class="comment">// C++14</span>
3450 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span>
3451 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// C++14</span>
3452 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3453 <span class="keyword">class</span> <span class="identifier">upgrade_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3454 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span>
3455 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">upgrade_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3456 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Mutex</span><span class="special">></span>
3457 <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3458 <span class="special">}</span>
3460 <div class="section">
3461 <div class="titlepage"><div><div><h4 class="title">
3462 <a name="thread.synchronization.locks.unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock">Class template
3463 <code class="computeroutput"><span class="identifier">unique_lock</span></code></a>
3464 </h4></div></div></div>
3465 <div class="toc"><dl class="toc">
3466 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt>
3467 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3468 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3469 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3470 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
3471 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3472 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt>
3473 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3474 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
3475 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span>
3476 <span class="identifier">sl</span><span class="special">,</span>
3477 <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
3478 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span>
3479 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&)</span></code></a></span></dt>
3480 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span>
3481 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&)</span></code></a></span></dt>
3482 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3483 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3484 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</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>
3485 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3486 <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3487 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</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>
3488 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3489 <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3490 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt>
3491 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
3492 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a></span></dt>
3493 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
3494 <span class="keyword">bool</span><span class="special">()</span>
3495 <span class="keyword">const</span></code></a></span></dt>
3496 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt>
3498 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
3499 <span class="comment">// #include <boost/thread/lock_types.hpp> </span>
3501 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
3502 <span class="keyword">class</span> <span class="identifier">unique_lock</span>
3503 <span class="special">{</span>
3504 <span class="keyword">public</span><span class="special">:</span>
3505 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
3506 <span class="identifier">unique_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
3507 <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
3508 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
3509 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3510 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
3512 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span>
3513 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> <span class="comment">// C++14 </span>
3514 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
3515 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
3516 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span> <span class="comment">// C++14</span>
3517 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
3518 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
3519 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> <span class="comment">// C++14</span>
3520 <span class="preprocessor">#endif</span>
3522 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
3523 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
3524 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
3525 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">);</span>
3526 <span class="special">~</span><span class="identifier">unique_lock</span><span class="special">();</span>
3528 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
3529 <span class="identifier">unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
3530 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3531 <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3533 <span class="identifier">unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3535 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3536 <span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
3538 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
3539 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
3541 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
3542 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
3543 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
3544 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
3546 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
3548 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3549 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3551 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3553 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
3554 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span>
3555 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
3556 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span>
3557 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">absolute_time</span><span class="special">);</span>
3558 <span class="preprocessor">#endif</span>
3560 <span class="special">};</span>
3563 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is more complex than
3564 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: not only does it provide
3565 for RAII-style locking, it also allows for deferring acquiring the lock
3566 until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
3567 member function is called explicitly, or trying to acquire the lock in
3568 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
3569 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
3570 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
3573 Specializations of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> model the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept if the supplied
3574 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3575 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span><span class="special">></span></code>),
3576 or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept if the supplied
3577 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3578 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span></code>),
3579 or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept if the supplied
3580 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3581 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept.
3584 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
3585 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
3586 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3587 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
3588 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3589 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
3590 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
3591 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock</span><span class="special">()</span></code></a>.
3594 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> are not thread-safe.
3595 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is intended to model
3596 the ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular
3597 thread, and the member functions that release ownership of the lock state
3598 (including the destructor) must be called by the same thread that acquired
3599 ownership of the lock state.
3601 <div class="section">
3602 <div class="titlepage"><div><div><h5 class="title">
3603 <a name="thread.synchronization.locks.unique_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor" title="unique_lock()"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a>
3604 </h5></div></div></div>
3605 <div class="variablelist">
3606 <p class="title"><b></b></p>
3607 <dl class="variablelist">
3608 <dt><span class="term">Effects:</span></dt>
3610 Creates a lock object with no associated mutex.
3612 <dt><span class="term">Postcondition:</span></dt>
3614 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3615 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3616 returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
3618 <dt><span class="term">Throws:</span></dt>
3625 <div class="section">
3626 <div class="titlepage"><div><div><h5 class="title">
3627 <a name="thread.synchronization.locks.unique_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor" title="unique_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3628 <span class="identifier">m</span><span class="special">)</span></code></a>
3629 </h5></div></div></div>
3630 <div class="variablelist">
3631 <p class="title"><b></b></p>
3632 <dl class="variablelist">
3633 <dt><span class="term">Effects:</span></dt>
3635 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3636 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3638 <dt><span class="term">Postcondition:</span></dt>
3640 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3641 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3642 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3644 <dt><span class="term">Throws:</span></dt>
3646 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3651 <div class="section">
3652 <div class="titlepage"><div><div><h5 class="title">
3653 <a name="thread.synchronization.locks.unique_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt" title="unique_lock(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3654 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
3655 </h5></div></div></div>
3656 <div class="variablelist">
3657 <p class="title"><b></b></p>
3658 <dl class="variablelist">
3659 <dt><span class="term">Precondition:</span></dt>
3661 The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
3663 <dt><span class="term">Effects:</span></dt>
3665 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3666 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3668 <dt><span class="term">Postcondition:</span></dt>
3670 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3671 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3672 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3674 <dt><span class="term">Throws:</span></dt>
3681 <div class="section">
3682 <div class="titlepage"><div><div><h5 class="title">
3683 <a name="thread.synchronization.locks.unique_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer" title="unique_lock(Lockable & m,boost::defer_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3684 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a>
3685 </h5></div></div></div>
3686 <div class="variablelist">
3687 <p class="title"><b></b></p>
3688 <dl class="variablelist">
3689 <dt><span class="term">Effects:</span></dt>
3691 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3693 <dt><span class="term">Postcondition:</span></dt>
3695 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3696 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3697 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3699 <dt><span class="term">Throws:</span></dt>
3706 <div class="section">
3707 <div class="titlepage"><div><div><h5 class="title">
3708 <a name="thread.synchronization.locks.unique_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try" title="unique_lock(Lockable & m,boost::try_to_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3709 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
3710 </h5></div></div></div>
3711 <div class="variablelist">
3712 <p class="title"><b></b></p>
3713 <dl class="variablelist">
3714 <dt><span class="term">Effects:</span></dt>
3716 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3717 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
3718 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3720 <dt><span class="term">Postcondition:</span></dt>
3722 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3723 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3724 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
3725 returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3726 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3727 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3728 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3729 returns <code class="computeroutput"><span class="keyword">false</span></code>.
3731 <dt><span class="term">Throws:</span></dt>
3738 <div class="section">
3739 <div class="titlepage"><div><div><h5 class="title">
3740 <a name="thread.synchronization.locks.unique_lock.constructor_sh_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try" title="unique_lock(shared_lock<mutex_type>&& sl, try_to_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span>
3741 <span class="identifier">sl</span><span class="special">,</span>
3742 <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
3743 </h5></div></div></div>
3744 <div class="variablelist">
3745 <p class="title"><b></b></p>
3746 <dl class="variablelist">
3747 <dt><span class="term">Requires:</span></dt>
3749 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3750 type must implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code>.
3752 <dt><span class="term">Effects:</span></dt>
3754 Constructs an object of type <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>. Let <code class="computeroutput"><span class="identifier">pm</span></code> be the pointer to the mutex
3755 and <code class="computeroutput"><span class="identifier">owns</span></code> the ownership
3756 state. Initializes <code class="computeroutput"><span class="identifier">pm</span></code>
3757 with nullptr and <code class="computeroutput"><span class="identifier">owns</span></code>
3758 with false. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3759 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3760 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3761 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3762 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3763 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3764 to <code class="computeroutput"><span class="keyword">true</span></code>.
3766 <dt><span class="term">Note:</span></dt>
3768 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3769 returns <code class="computeroutput"><span class="keyword">true</span></code> and
3770 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>
3771 returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3773 <dt><span class="term">Throws:</span></dt>
3777 <dt><span class="term">Notes:</span></dt>
3779 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3780 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3781 is defined on Windows platform
3786 <div class="section">
3787 <div class="titlepage"><div><div><h5 class="title">
3788 <a name="thread.synchronization.locks.unique_lock.constructor_sh_until"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until" title="unique_lock(shared_lock<mutex_type>&&, const chrono::time_point<Clock, Duration>&)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span>
3789 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&)</span></code></a>
3790 </h5></div></div></div>
3791 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
3792 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
3793 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
3795 <div class="variablelist">
3796 <p class="title"><b></b></p>
3797 <dl class="variablelist">
3798 <dt><span class="term">Requires:</span></dt>
3800 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3801 type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>.
3803 <dt><span class="term">Effects:</span></dt>
3805 Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing
3806 <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code>
3807 with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3808 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3809 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3810 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3811 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3812 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3813 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3814 to <code class="computeroutput"><span class="keyword">true</span></code>.
3816 <dt><span class="term">Note:</span></dt>
3818 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3819 returns <code class="computeroutput"><span class="keyword">true</span></code> and
3820 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span>
3821 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3822 <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3824 <dt><span class="term">Throws:</span></dt>
3828 <dt><span class="term">Notes:</span></dt>
3830 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3831 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3832 is defined on Windows platform
3837 <div class="section">
3838 <div class="titlepage"><div><div><h5 class="title">
3839 <a name="thread.synchronization.locks.unique_lock.constructor_sh_for"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for" title="unique_lock(shared_lock<mutex_type>&&, const chrono::duration<Rep, Period>&)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span>
3840 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&)</span></code></a>
3841 </h5></div></div></div>
3842 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
3843 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
3844 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span>
3846 <div class="variablelist">
3847 <p class="title"><b></b></p>
3848 <dl class="variablelist">
3849 <dt><span class="term">Requires:</span></dt>
3851 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3852 type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>.
3854 <dt><span class="term">Effects:</span></dt>
3856 Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing
3857 <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code>
3858 with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3859 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3860 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3861 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3862 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3863 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3864 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3865 to <code class="computeroutput"><span class="keyword">true</span></code>.
3867 <dt><span class="term">Note:</span></dt>
3869 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3870 returns <code class="computeroutput"><span class="keyword">true</span></code> and
3871 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span>
3872 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3873 <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3875 <dt><span class="term">Postcondition:</span></dt>
3879 <dt><span class="term">Throws:</span></dt>
3883 <dt><span class="term">Notes:</span></dt>
3885 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3886 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3887 is defined on Windows platform
3892 <div class="section">
3893 <div class="titlepage"><div><div><h5 class="title">
3894 <a name="thread.synchronization.locks.unique_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time" title="unique_lock(Lockable & m,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3895 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3896 </h5></div></div></div>
3897 <div class="variablelist">
3898 <p class="title"><b></b></p>
3899 <dl class="variablelist">
3900 <dt><span class="term">Effects:</span></dt>
3902 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3903 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>,
3904 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3906 <dt><span class="term">Postcondition:</span></dt>
3908 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3909 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3910 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
3911 returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3912 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3913 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3914 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3915 returns <code class="computeroutput"><span class="keyword">false</span></code>.
3917 <dt><span class="term">Throws:</span></dt>
3919 Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>.
3924 <div class="section">
3925 <div class="titlepage"><div><div><h5 class="title">
3926 <a name="thread.synchronization.locks.unique_lock.constructor_time_point"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point" title="template <class Clock, class Duration> unique_lock(Lockable & m,const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
3927 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3928 <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3929 </h5></div></div></div>
3930 <div class="variablelist">
3931 <p class="title"><b></b></p>
3932 <dl class="variablelist">
3933 <dt><span class="term">Effects:</span></dt>
3935 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3936 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>, and takes ownership of the lock
3937 state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3939 <dt><span class="term">Postcondition:</span></dt>
3941 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3942 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3943 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> returned
3944 <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3945 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3946 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3947 returns <code class="computeroutput"><span class="keyword">false</span></code>.
3949 <dt><span class="term">Throws:</span></dt>
3951 Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>.
3956 <div class="section">
3957 <div class="titlepage"><div><div><h5 class="title">
3958 <a name="thread.synchronization.locks.unique_lock.constructor_duration"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration" title="template <class Rep, class Period> unique_lock(Lockable & m,const chrono::duration<Rep, Period>& abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
3959 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
3960 <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3961 </h5></div></div></div>
3962 <div class="variablelist">
3963 <p class="title"><b></b></p>
3964 <dl class="variablelist">
3965 <dt><span class="term">Effects:</span></dt>
3967 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3968 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>,
3969 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3971 <dt><span class="term">Postcondition:</span></dt>
3973 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3974 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
3975 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> returned
3976 <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3977 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3978 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3979 returns <code class="computeroutput"><span class="keyword">false</span></code>.
3981 <dt><span class="term">Throws:</span></dt>
3983 Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>.
3988 <div class="section">
3989 <div class="titlepage"><div><div><h5 class="title">
3990 <a name="thread.synchronization.locks.unique_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.destructor" title="~unique_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a>
3991 </h5></div></div></div>
3992 <div class="variablelist">
3993 <p class="title"><b></b></p>
3994 <dl class="variablelist">
3995 <dt><span class="term">Effects:</span></dt>
3997 Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-></span></code> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
3998 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3999 returns <code class="computeroutput"><span class="keyword">true</span></code>.
4001 <dt><span class="term">Throws:</span></dt>
4008 <div class="section">
4009 <div class="titlepage"><div><div><h5 class="title">
4010 <a name="thread.synchronization.locks.unique_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4011 </h5></div></div></div>
4012 <div class="variablelist">
4013 <p class="title"><b></b></p>
4014 <dl class="variablelist">
4015 <dt><span class="term">Returns:</span></dt>
4017 <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4018 owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4019 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4021 <dt><span class="term">Throws:</span></dt>
4028 <div class="section">
4029 <div class="titlepage"><div><div><h5 class="title">
4030 <a name="thread.synchronization.locks.unique_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
4031 </h5></div></div></div>
4032 <div class="variablelist">
4033 <p class="title"><b></b></p>
4034 <dl class="variablelist">
4035 <dt><span class="term">Returns:</span></dt>
4037 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4038 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4039 or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4042 <dt><span class="term">Throws:</span></dt>
4049 <div class="section">
4050 <div class="titlepage"><div><div><h5 class="title">
4051 <a name="thread.synchronization.locks.unique_lock.explicit_bool_conversion"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4052 <span class="keyword">bool</span><span class="special">()</span>
4053 <span class="keyword">const</span></code></a>
4054 </h5></div></div></div>
4055 <div class="variablelist">
4056 <p class="title"><b></b></p>
4057 <dl class="variablelist">
4058 <dt><span class="term">Returns:</span></dt>
4060 <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code>.
4062 <dt><span class="term">Throws:</span></dt>
4069 <div class="section">
4070 <div class="titlepage"><div><div><h5 class="title">
4071 <a name="thread.synchronization.locks.unique_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a>
4072 </h5></div></div></div>
4073 <div class="variablelist">
4074 <p class="title"><b></b></p>
4075 <dl class="variablelist">
4076 <dt><span class="term">Effects:</span></dt>
4078 The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed,
4079 without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4080 would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4081 it is the responsibility of the calling code to ensure that the
4082 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly
4085 <dt><span class="term">Returns:</span></dt>
4087 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4088 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4089 at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4090 if there is no such object.
4092 <dt><span class="term">Throws:</span></dt>
4096 <dt><span class="term">Postcondition:</span></dt>
4098 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4099 is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4100 returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4101 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4102 returns <code class="computeroutput"><span class="keyword">false</span></code>.
4108 <div class="section">
4109 <div class="titlepage"><div><div><h4 class="title">
4110 <a name="thread.synchronization.locks.shared_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14">Class template
4111 <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a>
4112 </h4></div></div></div>
4113 <div class="toc"><dl class="toc">
4114 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt>
4115 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4116 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
4117 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4118 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
4119 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4120 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt>
4121 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4122 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
4123 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4124 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
4125 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt>
4126 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
4127 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
4128 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4129 <span class="keyword">bool</span><span class="special">()</span>
4130 <span class="keyword">const</span></code></a></span></dt>
4131 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt>
4133 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
4134 <span class="comment">// #include <boost/thread/lock_types.hpp> </span>
4136 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4137 <span class="keyword">class</span> <span class="identifier">shared_lock</span>
4138 <span class="special">{</span>
4139 <span class="keyword">public</span><span class="special">:</span>
4140 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4142 <span class="comment">// Shared locking</span>
4143 <span class="identifier">shared_lock</span><span class="special">();</span>
4144 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
4145 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
4146 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span>
4147 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4148 <span class="keyword">template</span> <span class="special"><</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>
4149 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
4150 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
4151 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">);</span>
4152 <span class="special">~</span><span class="identifier">shared_lock</span><span class="special">();</span>
4154 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4155 <span class="identifier">shared_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4157 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4158 <span class="identifier">shared_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4160 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4161 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4162 <span class="keyword">template</span> <span class="special"><</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>
4163 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
4164 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
4165 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
4166 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4168 <span class="comment">// Conversion from upgrade locking</span>
4169 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4171 <span class="comment">// Conversion from exclusive locking</span>
4172 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4174 <span class="comment">// Setters</span>
4175 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
4176 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4178 <span class="comment">// Getters</span>
4179 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4180 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4181 <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4183 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
4184 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span>
4185 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span>
4186 <span class="preprocessor">#endif</span>
4187 <span class="special">};</span>
4190 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than
4191 acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance
4192 of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> acquires shared ownership.
4195 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it
4196 provide for RAII-style locking, it also allows for deferring acquiring
4197 the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
4198 member function is called explicitly, or trying to acquire the lock in
4199 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
4200 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
4201 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
4204 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
4205 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
4206 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4207 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4208 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4209 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4210 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
4211 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
4214 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> are not thread-safe.
4215 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is intended to model
4216 the shared ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular
4217 thread, and the member functions that release ownership of the lock state
4218 (including the destructor) must be called by the same thread that acquired
4219 ownership of the lock state.
4221 <div class="section">
4222 <div class="titlepage"><div><div><h5 class="title">
4223 <a name="thread.synchronization.locks.shared_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor" title="shared_lock()"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a>
4224 </h5></div></div></div>
4225 <div class="variablelist">
4226 <p class="title"><b></b></p>
4227 <dl class="variablelist">
4228 <dt><span class="term">Effects:</span></dt>
4230 Creates a lock object with no associated mutex.
4232 <dt><span class="term">Postcondition:</span></dt>
4234 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4235 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4236 returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
4238 <dt><span class="term">Throws:</span></dt>
4245 <div class="section">
4246 <div class="titlepage"><div><div><h5 class="title">
4247 <a name="thread.synchronization.locks.shared_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor" title="shared_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4248 <span class="identifier">m</span><span class="special">)</span></code></a>
4249 </h5></div></div></div>
4250 <div class="variablelist">
4251 <p class="title"><b></b></p>
4252 <dl class="variablelist">
4253 <dt><span class="term">Effects:</span></dt>
4255 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4256 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>.
4258 <dt><span class="term">Postcondition:</span></dt>
4260 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4261 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4262 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
4264 <dt><span class="term">Throws:</span></dt>
4266 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>.
4271 <div class="section">
4272 <div class="titlepage"><div><div><h5 class="title">
4273 <a name="thread.synchronization.locks.shared_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt" title="shared_lock(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4274 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
4275 </h5></div></div></div>
4276 <div class="variablelist">
4277 <p class="title"><b></b></p>
4278 <dl class="variablelist">
4279 <dt><span class="term">Precondition:</span></dt>
4281 The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
4283 <dt><span class="term">Effects:</span></dt>
4285 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4286 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
4288 <dt><span class="term">Postcondition:</span></dt>
4290 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4291 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4292 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
4294 <dt><span class="term">Throws:</span></dt>
4301 <div class="section">
4302 <div class="titlepage"><div><div><h5 class="title">
4303 <a name="thread.synchronization.locks.shared_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer" title="shared_lock(Lockable & m,boost::defer_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4304 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a>
4305 </h5></div></div></div>
4306 <div class="variablelist">
4307 <p class="title"><b></b></p>
4308 <dl class="variablelist">
4309 <dt><span class="term">Effects:</span></dt>
4311 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4313 <dt><span class="term">Postcondition:</span></dt>
4315 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4316 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4317 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
4319 <dt><span class="term">Throws:</span></dt>
4326 <div class="section">
4327 <div class="titlepage"><div><div><h5 class="title">
4328 <a name="thread.synchronization.locks.shared_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try" title="shared_lock(Lockable & m,boost::try_to_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4329 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
4330 </h5></div></div></div>
4331 <div class="variablelist">
4332 <p class="title"><b></b></p>
4333 <dl class="variablelist">
4334 <dt><span class="term">Effects:</span></dt>
4336 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4337 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>,
4338 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4340 <dt><span class="term">Postcondition:</span></dt>
4342 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4343 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
4344 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
4345 returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4346 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4347 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4348 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4349 returns <code class="computeroutput"><span class="keyword">false</span></code>.
4351 <dt><span class="term">Throws:</span></dt>
4358 <div class="section">
4359 <div class="titlepage"><div><div><h5 class="title">
4360 <a name="thread.synchronization.locks.shared_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time" title="shared_lock(Lockable & m,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4361 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
4362 </h5></div></div></div>
4363 <div class="variablelist">
4364 <p class="title"><b></b></p>
4365 <dl class="variablelist">
4366 <dt><span class="term">Effects:</span></dt>
4368 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4369 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>,
4370 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4372 <dt><span class="term">Postcondition:</span></dt>
4374 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4375 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>.
4376 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
4377 returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4378 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4379 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4380 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4381 returns <code class="computeroutput"><span class="keyword">false</span></code>.
4383 <dt><span class="term">Throws:</span></dt>
4385 Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>.
4390 <div class="section">
4391 <div class="titlepage"><div><div><h5 class="title">
4392 <a name="thread.synchronization.locks.shared_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.destructor" title="~shared_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a>
4393 </h5></div></div></div>
4394 <div class="variablelist">
4395 <p class="title"><b></b></p>
4396 <dl class="variablelist">
4397 <dt><span class="term">Effects:</span></dt>
4399 Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-></span></code> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>
4400 if <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4401 returns <code class="computeroutput"><span class="keyword">true</span></code>.
4403 <dt><span class="term">Throws:</span></dt>
4410 <div class="section">
4411 <div class="titlepage"><div><div><h5 class="title">
4412 <a name="thread.synchronization.locks.shared_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4413 </h5></div></div></div>
4414 <div class="variablelist">
4415 <p class="title"><b></b></p>
4416 <dl class="variablelist">
4417 <dt><span class="term">Returns:</span></dt>
4419 <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4420 owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4421 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4423 <dt><span class="term">Throws:</span></dt>
4430 <div class="section">
4431 <div class="titlepage"><div><div><h5 class="title">
4432 <a name="thread.synchronization.locks.shared_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.mutex" title="Lockable* mutex() const"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4433 </h5></div></div></div>
4434 <div class="variablelist">
4435 <p class="title"><b></b></p>
4436 <dl class="variablelist">
4437 <dt><span class="term">Returns:</span></dt>
4439 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4440 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4441 or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4444 <dt><span class="term">Throws:</span></dt>
4451 <div class="section">
4452 <div class="titlepage"><div><div><h5 class="title">
4453 <a name="thread.synchronization.locks.shared_lock.explicit_operator_bool"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4454 <span class="keyword">bool</span><span class="special">()</span>
4455 <span class="keyword">const</span></code></a>
4456 </h5></div></div></div>
4457 <div class="variablelist">
4458 <p class="title"><b></b></p>
4459 <dl class="variablelist">
4460 <dt><span class="term">Returns:</span></dt>
4462 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>.
4464 <dt><span class="term">Throws:</span></dt>
4471 <div class="section">
4472 <div class="titlepage"><div><div><h5 class="title">
4473 <a name="thread.synchronization.locks.shared_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a>
4474 </h5></div></div></div>
4475 <div class="variablelist">
4476 <p class="title"><b></b></p>
4477 <dl class="variablelist">
4478 <dt><span class="term">Effects:</span></dt>
4480 The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed,
4481 without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4482 would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4483 it is the responsibility of the calling code to ensure that the
4484 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly
4487 <dt><span class="term">Returns:</span></dt>
4489 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4490 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4491 at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4492 if there is no such object.
4494 <dt><span class="term">Throws:</span></dt>
4498 <dt><span class="term">Postcondition:</span></dt>
4500 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4501 is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4502 returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4503 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4504 returns <code class="computeroutput"><span class="keyword">false</span></code>.
4510 <div class="section">
4511 <div class="titlepage"><div><div><h4 class="title">
4512 <a name="thread.synchronization.locks.upgrade_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION">Class template
4513 <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a>
4514 </h4></div></div></div>
4515 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
4516 <span class="comment">// #include <boost/thread/lock_types.hpp> </span>
4518 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4519 <span class="keyword">class</span> <span class="identifier">upgrade_lock</span>
4520 <span class="special">{</span>
4521 <span class="keyword">public</span><span class="special">:</span>
4522 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4524 <span class="comment">// Upgrade locking</span>
4526 <span class="identifier">upgrade_lock</span><span class="special">();</span>
4527 <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
4528 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">defer_lock_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
4529 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span>
4530 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span>
4531 <span class="keyword">template</span> <span class="special"><</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>
4532 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span>
4533 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
4534 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
4535 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span>
4536 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
4537 <span class="special">~</span><span class="identifier">upgrade_lock</span><span class="special">();</span>
4539 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4540 <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4542 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4543 <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4545 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4546 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4547 <span class="keyword">template</span> <span class="special"><</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>
4548 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
4549 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
4550 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
4551 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4553 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span>
4554 <span class="comment">// Conversion from shared locking</span>
4555 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span>
4556 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
4557 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
4558 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
4559 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
4560 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span>
4561 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
4562 <span class="preprocessor">#endif</span>
4564 <span class="comment">// Conversion from exclusive locking</span>
4565 <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4567 <span class="comment">// Setters</span>
4568 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
4569 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4571 <span class="comment">// Getters</span>
4572 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4573 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4574 <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4575 <span class="special">};</span>
4578 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than
4579 acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance
4580 of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> acquires upgrade
4584 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it
4585 provide for RAII-style locking, it also allows for deferring acquiring
4586 the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
4587 member function is called explicitly, or trying to acquire the lock in
4588 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
4589 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
4590 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
4593 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
4594 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
4595 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4596 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4597 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4598 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4599 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
4600 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>.
4603 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> are not thread-safe.
4604 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is intended to model
4605 the upgrade ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> object by a particular
4606 thread, and the member functions that release ownership of the lock state
4607 (including the destructor) must be called by the same thread that acquired
4608 ownership of the lock state.
4611 <div class="section">
4612 <div class="titlepage"><div><div><h4 class="title">
4613 <a name="thread.synchronization.locks.upgrade_to_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION">Class
4614 template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
4616 </h4></div></div></div>
4617 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
4618 <span class="comment">// #include <boost/thread/lock_types.hpp> </span>
4620 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">></span>
4621 <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span>
4622 <span class="special">{</span>
4623 <span class="keyword">public</span><span class="special">:</span>
4624 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4625 <span class="keyword">explicit</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&</span> <span class="identifier">m_</span><span class="special">);</span>
4626 <span class="special">~</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">();</span>
4628 <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4629 <span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4631 <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4632 <span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4634 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
4636 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4637 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4638 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4640 <span class="special">};</span>
4643 <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> allows
4644 for a temporary upgrade of an <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> to exclusive ownership.
4645 When constructed with a reference to an instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a>, if that instance
4646 has upgrade ownership on some <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, that ownership
4647 is upgraded to exclusive ownership. When the <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> instance
4648 is destroyed, the ownership of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is downgraded back to
4649 <span class="emphasis"><em>upgrade ownership</em></span>.
4652 <div class="section">
4653 <div class="titlepage"><div><div><h4 class="title">
4654 <a name="thread.synchronization.locks.scoped_try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.scoped_try_lock" title="Mutex-specific class scoped_try_lock -- DEPRECATED">Mutex-specific
4655 class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
4657 </h4></div></div></div>
4658 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span>
4659 <span class="special">{</span>
4660 <span class="keyword">private</span><span class="special">:</span>
4661 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&</span> <span class="identifier">other</span><span class="special">);</span>
4662 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&</span> <span class="identifier">other</span><span class="special">);</span>
4663 <span class="keyword">public</span><span class="special">:</span>
4664 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">();</span>
4665 <span class="keyword">explicit</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span>
4666 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
4667 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span>
4668 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4670 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">);</span>
4671 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">);</span>
4673 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
4675 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4676 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4677 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4679 <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4680 <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span>
4682 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4683 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4684 <span class="special">};</span>
4687 The member typedef <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code>
4688 is provided for each distinct <code class="computeroutput"><span class="identifier">MutexType</span></code>
4689 as a typedef to a class with the preceding definition. The semantics of
4690 each constructor and member function are identical to those of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span></code></a>
4691 for the same <code class="computeroutput"><span class="identifier">MutexType</span></code>,
4692 except that the constructor that takes a single reference to a mutex will
4693 call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a> rather than <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>.
4697 <div class="section">
4698 <div class="titlepage"><div><div><h3 class="title">
4699 <a name="thread.synchronization.other_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks" title="Other Lock Types - EXTENSION">Other Lock Types
4701 </h3></div></div></div>
4702 <div class="toc"><dl class="toc">
4703 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks">Strict
4704 Locks</a></span></dt>
4705 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs">Locking
4706 pointers</a></span></dt>
4707 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked">Externally
4708 Locked</a></span></dt>
4709 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard">Class
4710 template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a></span></dt>
4711 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock">Class
4712 template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a></span></dt>
4714 <div class="section">
4715 <div class="titlepage"><div><div><h4 class="title">
4716 <a name="thread.synchronization.other_locks.strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks" title="Strict Locks">Strict
4718 </h4></div></div></div>
4719 <div class="toc"><dl class="toc">
4720 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock">Class
4721 template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a></span></dt>
4722 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock">Class
4723 template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a></span></dt>
4724 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock">Non
4725 Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a></span></dt>
4726 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock">Non
4727 Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a></span></dt>
4729 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span>
4730 <span class="comment">// #include <boost/thread/strict_lock.hpp> </span>
4732 <span class="keyword">namespace</span> <span class="identifier">boost</span>
4733 <span class="special">{</span>
4735 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4736 <span class="keyword">class</span> <span class="identifier">strict_lock</span><span class="special">;</span>
4737 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
4738 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span><span class="special">;</span>
4739 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4740 <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">>;</span>
4741 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
4742 <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="special">>;</span>
4744 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_STRICT_LOCK</span>
4745 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4746 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
4747 <span class="preprocessor">#endif</span>
4748 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK</span>
4749 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
4750 <span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span>
4751 <span class="preprocessor">#endif</span>
4753 <span class="special">}</span>
4755 <div class="section">
4756 <div class="titlepage"><div><div><h5 class="title">
4757 <a name="thread.synchronization.other_locks.strict_locks.strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock">Class
4758 template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a>
4759 </h5></div></div></div>
4760 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
4761 <span class="comment">// #include <boost/thread/strict_lock.hpp> </span>
4763 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">BasicLockable</span><span class="special">></span>
4764 <span class="keyword">class</span> <span class="identifier">strict_lock</span>
4765 <span class="special">{</span>
4766 <span class="keyword">public</span><span class="special">:</span>
4767 <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4768 <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4769 <span class="identifier">strict_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4770 <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
4771 <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">();</span>
4773 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
4774 <span class="special">};</span>
4777 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is a model of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>.
4780 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is the simplest
4781 <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>: on construction
4782 it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept supplied
4783 as the constructor parameter. On destruction, the ownership is released.
4784 This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> object, to facilitate
4785 exception-safe locking and unlocking.
4788 <a name="thread.synchronization.other_locks.strict_locks.strict_lock.h0"></a>
4789 <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_">See
4790 also <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>
4792 <div class="section">
4793 <div class="titlepage"><div><div><h6 class="title">
4794 <a name="thread.synchronization.other_locks.strict_locks.strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.constructor" title="strict_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span>
4795 <span class="identifier">m</span><span class="special">)</span></code></a>
4796 </h6></div></div></div>
4797 <div class="variablelist">
4798 <p class="title"><b></b></p>
4799 <dl class="variablelist">
4800 <dt><span class="term">Effects:</span></dt>
4802 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4803 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4805 <dt><span class="term">Throws:</span></dt>
4807 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4812 <div class="section">
4813 <div class="titlepage"><div><div><h6 class="title">
4814 <a name="thread.synchronization.other_locks.strict_locks.strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.destructor" title="~strict_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock</span><span class="special">()</span></code></a>
4815 </h6></div></div></div>
4816 <div class="variablelist">
4817 <p class="title"><b></b></p>
4818 <dl class="variablelist">
4819 <dt><span class="term">Effects:</span></dt>
4821 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
4822 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
4825 <dt><span class="term">Throws:</span></dt>
4833 <div class="section">
4834 <div class="titlepage"><div><div><h5 class="title">
4835 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock">Class
4836 template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a>
4837 </h5></div></div></div>
4838 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
4839 <span class="comment">// #include <boost/thread/strict_lock.hpp> </span>
4841 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
4842 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
4843 <span class="special">{</span>
4844 <span class="keyword">public</span><span class="special">:</span>
4845 <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4846 <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">nested_strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4847 <span class="identifier">nested_strict_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">nested_strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4848 <span class="keyword">explicit</span> <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">),</span>
4849 <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4851 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
4852 <span class="special">};</span>
4855 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock"><code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a> is a model
4856 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>.
4859 A nested strict lock is a scoped lock guard ensuring a mutex is locked
4860 on its scope, by taking ownership of an nesting lock, locking the mutex
4861 on construction if not already locked and restoring the ownership to
4862 the nesting lock on destruction.
4865 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.h0"></a>
4866 <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_">See
4867 also <code class="computeroutput"><span class="identifier">strict_lock</span></code>, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>
4869 <div class="section">
4870 <div class="titlepage"><div><div><h6 class="title">
4871 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor" title="nested_strict_lock(Lock & lk)"><code class="computeroutput"><span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span>
4872 <span class="identifier">lk</span><span class="special">)</span></code></a>
4873 </h6></div></div></div>
4874 <div class="variablelist">
4875 <p class="title"><b></b></p>
4876 <dl class="variablelist">
4877 <dt><span class="term">Requires:</span></dt>
4879 <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span>
4880 <span class="special">!=</span> <span class="identifier">null_ptr</span></code>.
4882 <dt><span class="term">Effects:</span></dt>
4884 Stores the reference to the lock parameter <code class="computeroutput"><span class="identifier">lk</span></code>
4885 and takes ownership on it. If the lock doesn't owns the mutex
4888 <dt><span class="term">Postcondition:</span></dt>
4890 <code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">())</span></code>.
4892 <dt><span class="term">Throws:</span></dt>
4895 - lock_error when BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
4896 is defined and lk.mutex() == null_ptr
4899 - Any exception that @c lk.lock() can throw.
4905 <div class="section">
4906 <div class="titlepage"><div><div><h6 class="title">
4907 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor" title="~nested_strict_lock() noexcept"><code class="computeroutput"><span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span></code></a>
4908 </h6></div></div></div>
4909 <div class="variablelist">
4910 <p class="title"><b></b></p>
4911 <dl class="variablelist">
4912 <dt><span class="term">Effects:</span></dt>
4914 Restores ownership to the nesting lock.
4919 <div class="section">
4920 <div class="titlepage"><div><div><h6 class="title">
4921 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock" title="bool owns_lock(mutex_type const* l) const noexcept"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span>
4922 <span class="keyword">const</span><span class="special">*</span>
4923 <span class="identifier">l</span><span class="special">)</span>
4924 <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
4925 </h6></div></div></div>
4926 <div class="variablelist">
4927 <p class="title"><b></b></p>
4928 <dl class="variablelist">
4929 <dt><span class="term">Return:</span></dt>
4931 Whether if this lock is locking that mutex.
4937 <div class="section">
4938 <div class="titlepage"><div><div><h5 class="title">
4939 <a name="thread.synchronization.other_locks.strict_locks.make_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock" title="Non Member Function make_strict_lock">Non
4940 Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a>
4941 </h5></div></div></div>
4942 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
4943 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4945 <div class="variablelist">
4946 <p class="title"><b></b></p>
4947 <dl class="variablelist">
4948 <dt><span class="term">Returns:</span></dt>
4950 a strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
4952 <dt><span class="term">Throws:</span></dt>
4954 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4959 <div class="section">
4960 <div class="titlepage"><div><div><h5 class="title">
4961 <a name="thread.synchronization.other_locks.strict_locks.make_nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock" title="Non Member Function make_nested_strict_lock">Non
4962 Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a>
4963 </h5></div></div></div>
4964 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
4965 <span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4967 <div class="variablelist">
4968 <p class="title"><b></b></p>
4969 <dl class="variablelist">
4970 <dt><span class="term">Returns:</span></dt>
4972 a nested_strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">lk</span><span class="special">}</span></code>.
4974 <dt><span class="term">Throws:</span></dt>
4976 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4982 <div class="section">
4983 <div class="titlepage"><div><div><h4 class="title">
4984 <a name="thread.synchronization.other_locks.lock_ptrs"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs" title="Locking pointers">Locking
4986 </h4></div></div></div>
4987 <div class="toc"><dl class="toc">
4988 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr">Class
4989 template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
4990 </code></a></span></dt>
4991 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr">Class
4992 template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a></span></dt>
4994 <pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span>
4995 <span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span>
4997 <span class="keyword">namespace</span> <span class="identifier">boost</span>
4998 <span class="special">{</span>
5000 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span>
5001 <span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span><span class="special">;</span>
5002 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span>
5003 <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span><span class="special">;</span>
5004 <span class="special">}</span>
5006 <div class="section">
5007 <div class="titlepage"><div><div><h5 class="title">
5008 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr" title="Class template const_strict_lock_ptr">Class
5009 template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
5011 </h5></div></div></div>
5012 <pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span>
5013 <span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span>
5016 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span>
5017 <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span>
5018 <span class="special">{</span>
5019 <span class="keyword">public</span><span class="special">:</span>
5020 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
5021 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5023 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">const_strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5024 <span class="identifier">const_strict_lock_ptr</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">const_strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5026 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
5027 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span>
5029 <span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5031 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
5032 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
5034 <span class="special">};</span>
5036 <div class="section">
5037 <div class="titlepage"><div><div><h6 class="title">
5038 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor" title="const_strict_lock_ptr(T const&,Lockable&)"><code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a>
5039 </h6></div></div></div>
5040 <pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">);</span>
5042 <div class="variablelist">
5043 <p class="title"><b></b></p>
5044 <dl class="variablelist">
5045 <dt><span class="term">Effects:</span></dt>
5047 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>,
5048 stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5050 <dt><span class="term">Throws:</span></dt>
5052 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
5057 <div class="section">
5058 <div class="titlepage"><div><div><h6 class="title">
5059 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt" title="const_strict_lock_ptr(T const&,Lockable&,adopt_lock_t)"><code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5060 </h6></div></div></div>
5061 <pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span>
5063 <div class="variablelist">
5064 <p class="title"><b></b></p>
5065 <dl class="variablelist">
5066 <dt><span class="term">Effects:</span></dt>
5068 Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5070 <dt><span class="term">Throws:</span></dt>
5077 <div class="section">
5078 <div class="titlepage"><div><div><h6 class="title">
5079 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor" title="~const_strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">()</span></code></a>
5080 </h6></div></div></div>
5081 <pre class="programlisting"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5083 <div class="variablelist">
5084 <p class="title"><b></b></p>
5085 <dl class="variablelist">
5086 <dt><span class="term">Effects:</span></dt>
5088 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
5089 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
5092 <dt><span class="term">Throws:</span></dt>
5099 <div class="section">
5100 <div class="titlepage"><div><div><h6 class="title">
5101 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir" title="operator->() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span>
5102 <span class="keyword">const</span></code></a>
5103 </h6></div></div></div>
5104 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
5106 <div class="variablelist">
5107 <p class="title"><b></b></p>
5108 <dl class="variablelist">
5109 <dt><span class="term">Return:</span></dt>
5111 return a constant pointer to the protected value.
5113 <dt><span class="term">Throws:</span></dt>
5120 <div class="section">
5121 <div class="titlepage"><div><div><h6 class="title">
5122 <a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref" title="operator*() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span>
5123 <span class="keyword">const</span></code></a>
5124 </h6></div></div></div>
5125 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
5127 <div class="variablelist">
5128 <p class="title"><b></b></p>
5129 <dl class="variablelist">
5130 <dt><span class="term">Return:</span></dt>
5132 return a constant reference to the protected value.
5134 <dt><span class="term">Throws:</span></dt>
5142 <div class="section">
5143 <div class="titlepage"><div><div><h5 class="title">
5144 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr" title="Class template strict_lock_ptr">Class
5145 template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a>
5146 </h5></div></div></div>
5147 <pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span>
5148 <span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span>
5150 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span>
5151 <span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span>
5152 <span class="special">{</span>
5153 <span class="keyword">public</span><span class="special">:</span>
5154 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5155 <span class="identifier">strict_lock_ptr</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5157 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
5158 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span>
5159 <span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5161 <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->();</span>
5162 <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*();</span>
5164 <span class="special">};</span>
5166 <div class="section">
5167 <div class="titlepage"><div><div><h6 class="title">
5168 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor" title="strict_lock_ptr(T const&,Lockable&)"><code class="computeroutput"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a>
5169 </h6></div></div></div>
5170 <pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">);</span>
5172 <div class="variablelist">
5173 <p class="title"><b></b></p>
5174 <dl class="variablelist">
5175 <dt><span class="term">Effects:</span></dt>
5177 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>,
5178 stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5180 <dt><span class="term">Throws:</span></dt>
5182 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
5187 <div class="section">
5188 <div class="titlepage"><div><div><h6 class="title">
5189 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt" title="strict_lock_ptr(T const&,Lockable&,adopt_lock_t)"><code class="computeroutput"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5190 </h6></div></div></div>
5191 <pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span>
5193 <div class="variablelist">
5194 <p class="title"><b></b></p>
5195 <dl class="variablelist">
5196 <dt><span class="term">Effects:</span></dt>
5198 Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5200 <dt><span class="term">Throws:</span></dt>
5207 <div class="section">
5208 <div class="titlepage"><div><div><h6 class="title">
5209 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor" title="~strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">()</span></code></a>
5210 </h6></div></div></div>
5211 <pre class="programlisting"><span class="special">~</span> <span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5213 <div class="variablelist">
5214 <p class="title"><b></b></p>
5215 <dl class="variablelist">
5216 <dt><span class="term">Effects:</span></dt>
5218 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
5219 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
5222 <dt><span class="term">Throws:</span></dt>
5229 <div class="section">
5230 <div class="titlepage"><div><div><h6 class="title">
5231 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir" title="operator->()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code></a>
5232 </h6></div></div></div>
5233 <pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->();</span>
5235 <div class="variablelist">
5236 <p class="title"><b></b></p>
5237 <dl class="variablelist">
5238 <dt><span class="term">Return:</span></dt>
5240 return a pointer to the protected value.
5242 <dt><span class="term">Throws:</span></dt>
5249 <div class="section">
5250 <div class="titlepage"><div><div><h6 class="title">
5251 <a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref" title="operator*()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a>
5252 </h6></div></div></div>
5253 <pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*();</span>
5255 <div class="variablelist">
5256 <p class="title"><b></b></p>
5257 <dl class="variablelist">
5258 <dt><span class="term">Return:</span></dt>
5260 return a reference to the protected value.
5262 <dt><span class="term">Throws:</span></dt>
5271 <div class="section">
5272 <div class="titlepage"><div><div><h4 class="title">
5273 <a name="thread.synchronization.other_locks.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked" title="Externally Locked">Externally
5275 </h4></div></div></div>
5276 <div class="toc"><dl class="toc">
5277 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked">Template
5278 Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a></span></dt>
5279 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref">Template
5280 Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span></code></a></span></dt>
5281 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&,</span>
5282 <span class="identifier">externally_locked</span><span class="special">&)</span></code></a></span></dt>
5284 <pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span>
5285 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span>
5286 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">;</span>
5287 <span class="keyword">template</span> <span class="special"><</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>
5288 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&,</span> <span class="identifier">MutexType</span><span class="special">>;</span>
5290 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span>
5291 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5293 <div class="section">
5294 <div class="titlepage"><div><div><h5 class="title">
5295 <a name="thread.synchronization.other_locks.externally_locked.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked" title="Template Class externally_locked">Template
5296 Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a>
5297 </h5></div></div></div>
5298 <pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span>
5300 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span>
5301 <span class="keyword">class</span> <span class="identifier">externally_locked</span>
5302 <span class="special">{</span>
5303 <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));</span>
5304 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span> <span class="special">));</span>
5306 <span class="keyword">public</span><span class="special">:</span>
5307 <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5309 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span>
5310 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">obj</span><span class="special">);</span>
5311 <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
5312 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5313 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span>
5314 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5315 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span>
5317 <span class="comment">// observers</span>
5318 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5319 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5321 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5322 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5323 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5324 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5326 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5327 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span>
5328 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5329 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5331 <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 <span class="comment">// modifiers</span>
5334 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5335 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5336 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5337 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&);</span>
5338 <span class="special">};</span>
5341 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5342 a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object
5343 of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5344 provides full access to that object through the get and set member functions,
5345 provided you pass a reference to a strict lock object.
5348 Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here.
5350 <div class="section">
5351 <div class="titlepage"><div><div><h6 class="title">
5352 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor1" title="externally_locked(mutex_type&, const T&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&,</span>
5353 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span></code></a>
5354 </h6></div></div></div>
5355 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span>
5357 <div class="variablelist">
5358 <p class="title"><b></b></p>
5359 <dl class="variablelist">
5360 <dt><span class="term">Requires:</span></dt>
5362 T is a model of CopyConstructible.
5364 <dt><span class="term">Effects:</span></dt>
5366 Constructs an externally locked object copying the cloaked type.
5368 <dt><span class="term">Throws:</span></dt>
5370 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>.
5375 <div class="section">
5376 <div class="titlepage"><div><div><h6 class="title">
5377 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor2" title="externally_locked(mutex_type&, T&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&,</span>
5378 <span class="identifier">T</span><span class="special">&&)</span></code></a>
5379 </h6></div></div></div>
5380 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">obj</span><span class="special">);</span>
5382 <div class="variablelist">
5383 <p class="title"><b></b></p>
5384 <dl class="variablelist">
5385 <dt><span class="term">Requires:</span></dt>
5387 T is a model of Movable.
5389 <dt><span class="term">Effects:</span></dt>
5391 Constructs an externally locked object by moving the cloaked
5394 <dt><span class="term">Throws:</span></dt>
5396 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>.
5401 <div class="section">
5402 <div class="titlepage"><div><div><h6 class="title">
5403 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor3" title="externally_locked(mutex_type&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&)</span></code></a>
5404 </h6></div></div></div>
5405 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
5407 <div class="variablelist">
5408 <p class="title"><b></b></p>
5409 <dl class="variablelist">
5410 <dt><span class="term">Requires:</span></dt>
5412 T is a model of DefaultConstructible.
5414 <dt><span class="term">Effects:</span></dt>
5416 Constructs an externally locked object by default constructing
5419 <dt><span class="term">Throws:</span></dt>
5421 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code>.
5426 <div class="section">
5427 <div class="titlepage"><div><div><h6 class="title">
5428 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a>
5429 </h6></div></div></div>
5430 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span>
5432 <div class="variablelist">
5433 <p class="title"><b></b></p>
5434 <dl class="variablelist">
5435 <dt><span class="term">Requires:</span></dt>
5437 T is a model of Movable.
5439 <dt><span class="term">Effects:</span></dt>
5441 Move constructs an externally locked object by moving the cloaked
5442 type and copying the mutex reference
5444 <dt><span class="term">Throws:</span></dt>
5446 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&)</span></code>.
5451 <div class="section">
5452 <div class="titlepage"><div><div><h6 class="title">
5453 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a>
5454 </h6></div></div></div>
5455 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5457 <div class="variablelist">
5458 <p class="title"><b></b></p>
5459 <dl class="variablelist">
5460 <dt><span class="term">Requires:</span></dt>
5462 T is a model of Copyable.
5464 <dt><span class="term">Effects:</span></dt>
5466 Copy constructs an externally locked object by copying the cloaked
5467 type and copying the mutex reference
5469 <dt><span class="term">Throws:</span></dt>
5471 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&)</span></code>.
5476 <div class="section">
5477 <div class="titlepage"><div><div><h6 class="title">
5478 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a>
5479 </h6></div></div></div>
5480 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span>
5482 <div class="variablelist">
5483 <p class="title"><b></b></p>
5484 <dl class="variablelist">
5485 <dt><span class="term">Requires:</span></dt>
5487 T is a model of Movable.
5489 <dt><span class="term">Effects:</span></dt>
5491 Move assigns an externally locked object by moving the cloaked
5492 type and copying the mutex reference
5494 <dt><span class="term">Throws:</span></dt>
5496 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&&)</span></code>.
5501 <div class="section">
5502 <div class="titlepage"><div><div><h6 class="title">
5503 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a>
5504 </h6></div></div></div>
5505 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5507 <div class="variablelist">
5508 <p class="title"><b></b></p>
5509 <dl class="variablelist">
5510 <dt><span class="term">Requires:</span></dt>
5512 T is a model of Copyable.
5514 <dt><span class="term">Effects:</span></dt>
5516 Copy assigns an externally locked object by copying the cloaked
5517 type and copying the mutex reference
5519 <dt><span class="term">Throws:</span></dt>
5521 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&)</span></code>.
5526 <div class="section">
5527 <div class="titlepage"><div><div><h6 class="title">
5528 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get1" title="get(strict_lock<mutex_type>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&)</span></code></a>
5529 </h6></div></div></div>
5530 <pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5531 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5533 <div class="variablelist">
5534 <p class="title"><b></b></p>
5535 <dl class="variablelist">
5536 <dt><span class="term">Requires:</span></dt>
5538 The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5539 must be locking the associated mutex.
5541 <dt><span class="term">Returns:</span></dt>
5543 A reference to the cloaked object
5545 <dt><span class="term">Throws:</span></dt>
5547 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5548 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5549 is defined and the run-time preconditions are not satisfied .
5554 <div class="section">
5555 <div class="titlepage"><div><div><h6 class="title">
5556 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get2" title="get(strict_lock<nested_strict_lock<Lock>>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>>&)</span></code></a>
5557 </h6></div></div></div>
5558 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5559 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5560 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5561 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5563 <div class="variablelist">
5564 <p class="title"><b></b></p>
5565 <dl class="variablelist">
5566 <dt><span class="term">Requires:</span></dt>
5568 <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span>
5569 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5570 parameter must be locking the associated mutex.
5572 <dt><span class="term">Returns:</span></dt>
5574 A reference to the cloaked object
5576 <dt><span class="term">Throws:</span></dt>
5578 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5579 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5580 is defined and the run-time preconditions are not satisfied .
5585 <div class="section">
5586 <div class="titlepage"><div><div><h6 class="title">
5587 <a name="thread.synchronization.other_locks.externally_locked.externally_locked.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get3" title="get(strict_lock<nested_strict_lock<Lock>>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>>&)</span></code></a>
5588 </h6></div></div></div>
5589 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5590 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span>
5591 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5592 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5594 <div class="variablelist">
5595 <p class="title"><b></b></p>
5596 <dl class="variablelist">
5597 <dt><span class="term">Requires:</span></dt>
5599 <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5600 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span>
5601 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5602 parameter must be locking the associated mutex.
5604 <dt><span class="term">Returns:</span></dt>
5606 A reference to the cloaked object
5608 <dt><span class="term">Throws:</span></dt>
5610 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5611 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5612 is defined and the run-time preconditions are not satisfied .
5618 <div class="section">
5619 <div class="titlepage"><div><div><h5 class="title">
5620 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref" title="Template Class externally_locked<T&>">Template
5621 Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span></code></a>
5622 </h5></div></div></div>
5623 <pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span>
5625 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span>
5626 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&,</span> <span class="identifier">MutexType</span><span class="special">></span>
5627 <span class="special">{</span>
5628 <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));</span>
5629 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span> <span class="special">));</span>
5631 <span class="keyword">public</span><span class="special">:</span>
5632 <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5634 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span>
5635 <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span>
5636 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5637 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</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="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5639 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5641 <span class="comment">// observers</span>
5642 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5643 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5645 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5646 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5647 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5648 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5650 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5651 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span>
5652 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5653 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5655 <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 <span class="comment">// modifiers</span>
5658 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5659 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5660 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5661 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5662 <span class="special">};</span>
5665 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5666 a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object
5667 of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5668 provides full access to that object through the get and set member functions,
5669 provided you pass a reference to a strict lock object.
5672 Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here.
5674 <div class="section">
5675 <div class="titlepage"><div><div><h6 class="title">
5676 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1" title="externally_locked<T&>(mutex_type&, T&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">mutex_type</span><span class="special">&,</span>
5677 <span class="identifier">T</span><span class="special">&)</span></code></a>
5678 </h6></div></div></div>
5679 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5681 <div class="variablelist">
5682 <p class="title"><b></b></p>
5683 <dl class="variablelist">
5684 <dt><span class="term">Effects:</span></dt>
5686 Constructs an externally locked object copying the cloaked reference.
5691 <div class="section">
5692 <div class="titlepage"><div><div><h6 class="title">
5693 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4" title="externally_locked<T&>(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a>
5694 </h6></div></div></div>
5695 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5697 <div class="variablelist">
5698 <p class="title"><b></b></p>
5699 <dl class="variablelist">
5700 <dt><span class="term">Effects:</span></dt>
5702 Moves an externally locked object by moving the cloaked type
5703 and copying the mutex reference
5708 <div class="section">
5709 <div class="titlepage"><div><div><h6 class="title">
5710 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a>
5711 </h6></div></div></div>
5712 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span>
5714 <div class="variablelist">
5715 <p class="title"><b></b></p>
5716 <dl class="variablelist">
5717 <dt><span class="term">Effects:</span></dt>
5719 Move assigns an externally locked object by copying the cloaked
5720 reference and copying the mutex reference
5725 <div class="section">
5726 <div class="titlepage"><div><div><h6 class="title">
5727 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a>
5728 </h6></div></div></div>
5729 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span>
5731 <div class="variablelist">
5732 <p class="title"><b></b></p>
5733 <dl class="variablelist">
5734 <dt><span class="term">Requires:</span></dt>
5736 T is a model of Copyable.
5738 <dt><span class="term">Effects:</span></dt>
5740 Copy assigns an externally locked object by copying the cloaked
5741 reference and copying the mutex reference
5743 <dt><span class="term">Throws:</span></dt>
5745 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&)</span></code>.
5750 <div class="section">
5751 <div class="titlepage"><div><div><h6 class="title">
5752 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1" title="get(strict_lock<mutex_type>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&)</span></code></a>
5753 </h6></div></div></div>
5754 <pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5755 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5757 <div class="variablelist">
5758 <p class="title"><b></b></p>
5759 <dl class="variablelist">
5760 <dt><span class="term">Requires:</span></dt>
5762 The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5763 must be locking the associated mutex.
5765 <dt><span class="term">Returns:</span></dt>
5767 A reference to the cloaked object
5769 <dt><span class="term">Throws:</span></dt>
5771 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5772 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5773 is defined and the run-time preconditions are not satisfied .
5778 <div class="section">
5779 <div class="titlepage"><div><div><h6 class="title">
5780 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2" title="get(strict_lock<nested_strict_lock<Lock>>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>>&)</span></code></a>
5781 </h6></div></div></div>
5782 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5783 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span>
5784 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5785 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5787 <div class="variablelist">
5788 <p class="title"><b></b></p>
5789 <dl class="variablelist">
5790 <dt><span class="term">Requires:</span></dt>
5792 <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span>
5793 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5794 parameter must be locking the associated mutex.
5796 <dt><span class="term">Returns:</span></dt>
5798 A reference to the cloaked object
5800 <dt><span class="term">Throws:</span></dt>
5802 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5803 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5804 is defined and the run-time preconditions are not satisfied .
5809 <div class="section">
5810 <div class="titlepage"><div><div><h6 class="title">
5811 <a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3" title="get(strict_lock<nested_strict_lock<Lock>>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>>&)</span></code></a>
5812 </h6></div></div></div>
5813 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5814 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span>
5815 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span>
5816 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5818 <div class="variablelist">
5819 <p class="title"><b></b></p>
5820 <dl class="variablelist">
5821 <dt><span class="term">Requires:</span></dt>
5823 <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5824 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span>
5825 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5826 parameter must be locking the associated mutex.
5828 <dt><span class="term">Returns:</span></dt>
5830 A reference to the cloaked object
5832 <dt><span class="term">Throws:</span></dt>
5834 <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5835 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5836 is defined and the run-time preconditions are not satisfied .
5842 <div class="section">
5843 <div class="titlepage"><div><div><h5 class="title">
5844 <a name="thread.synchronization.other_locks.externally_locked.swap"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap" title="swap(externally_locked&, externally_locked&)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&,</span>
5845 <span class="identifier">externally_locked</span><span class="special">&)</span></code></a>
5846 </h5></div></div></div>
5847 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span>
5848 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span>
5852 <div class="section">
5853 <div class="titlepage"><div><div><h4 class="title">
5854 <a name="thread.synchronization.other_locks.shared_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard">Class
5855 template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a>
5856 </h4></div></div></div>
5857 <div class="toc"><dl class="toc">
5858 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span>
5859 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5860 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span>
5861 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
5862 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a></span></dt>
5864 <pre class="programlisting"><span class="comment">// #include <boost/thread/shared_lock_guard.hpp></span>
5865 <span class="keyword">namespace</span> <span class="identifier">boost</span>
5866 <span class="special">{</span>
5867 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">SharedLockable</span><span class="special">></span>
5868 <span class="keyword">class</span> <span class="identifier">shared_lock_guard</span>
5869 <span class="special">{</span>
5870 <span class="keyword">public</span><span class="special">:</span>
5871 <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">shared_lock_guard</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5872 <span class="identifier">shared_lock_guard</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock_guard</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5874 <span class="keyword">explicit</span> <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
5875 <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
5877 <span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">();</span>
5878 <span class="special">};</span>
5879 <span class="special">}</span>
5882 <a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> is very simple:
5883 on construction it acquires shared ownership of the implementation of the
5884 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> supplied
5885 as the constructor parameter. On destruction, the ownership is released.
5886 This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object, to facilitate
5887 exception-safe shared locking and unlocking. In addition, the <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code> constructor allows the <a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> object to take
5888 shared ownership of a lock already held by the current thread.
5890 <div class="section">
5891 <div class="titlepage"><div><div><h5 class="title">
5892 <a name="thread.synchronization.other_locks.shared_lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor" title="shared_lock_guard(SharedLockable & m)"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span>
5893 <span class="identifier">m</span><span class="special">)</span></code></a>
5894 </h5></div></div></div>
5895 <div class="variablelist">
5896 <p class="title"><b></b></p>
5897 <dl class="variablelist">
5898 <dt><span class="term">Effects:</span></dt>
5900 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5901 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5903 <dt><span class="term">Throws:</span></dt>
5905 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5910 <div class="section">
5911 <div class="titlepage"><div><div><h5 class="title">
5912 <a name="thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt" title="shared_lock_guard(SharedLockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span>
5913 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5914 </h5></div></div></div>
5915 <div class="variablelist">
5916 <p class="title"><b></b></p>
5917 <dl class="variablelist">
5918 <dt><span class="term">Precondition:</span></dt>
5920 The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
5921 equivalent to one obtained by a call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5923 <dt><span class="term">Effects:</span></dt>
5925 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5926 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
5928 <dt><span class="term">Throws:</span></dt>
5935 <div class="section">
5936 <div class="titlepage"><div><div><h5 class="title">
5937 <a name="thread.synchronization.other_locks.shared_lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor" title="~shared_lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a>
5938 </h5></div></div></div>
5939 <div class="variablelist">
5940 <p class="title"><b></b></p>
5941 <dl class="variablelist">
5942 <dt><span class="term">Effects:</span></dt>
5944 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object
5945 passed to the constructor.
5947 <dt><span class="term">Throws:</span></dt>
5955 <div class="section">
5956 <div class="titlepage"><div><div><h4 class="title">
5957 <a name="thread.synchronization.other_locks.reverse_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock">Class
5958 template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a>
5959 </h4></div></div></div>
5960 <div class="toc"><dl class="toc">
5961 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span>
5962 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5963 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a></span></dt>
5965 <pre class="programlisting"><span class="comment">// #include <boost/thread/reverse_lock.hpp></span>
5966 <span class="keyword">namespace</span> <span class="identifier">boost</span>
5967 <span class="special">{</span>
5969 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span>
5970 <span class="keyword">class</span> <span class="identifier">reverse_lock</span>
5971 <span class="special">{</span>
5972 <span class="keyword">public</span><span class="special">:</span>
5973 <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5974 <span class="identifier">reverse_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5976 <span class="keyword">explicit</span> <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span>
5977 <span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">();</span>
5978 <span class="special">};</span>
5979 <span class="special">}</span>
5982 <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> reverse the operations
5983 of a lock: it provide for RAII-style, that unlocks the lock at construction
5984 time and lock it at destruction time. In addition, it transfer ownership
5985 temporarily, so that the mutex can not be locked using the Lock.
5988 An instance of <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> doesn't <span class="emphasis"><em>own</em></span>
5991 <div class="section">
5992 <div class="titlepage"><div><div><h5 class="title">
5993 <a name="thread.synchronization.other_locks.reverse_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor" title="reverse_lock(Lock & m)"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span>
5994 <span class="identifier">m</span><span class="special">)</span></code></a>
5995 </h5></div></div></div>
5996 <div class="variablelist">
5997 <p class="title"><b></b></p>
5998 <dl class="variablelist">
5999 <dt><span class="term">Effects:</span></dt>
6001 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
6002 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
6003 if <code class="computeroutput"><span class="identifier">m</span></code> owns his lock
6004 and then stores the mutex by calling <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>.
6006 <dt><span class="term">Postcondition:</span></dt>
6008 <code class="computeroutput"><span class="special">!</span><span class="identifier">m</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span> <span class="special">&&</span>
6009 <span class="identifier">m</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span></code>.
6011 <dt><span class="term">Throws:</span></dt>
6013 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>.
6018 <div class="section">
6019 <div class="titlepage"><div><div><h5 class="title">
6020 <a name="thread.synchronization.other_locks.reverse_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor" title="~reverse_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a>
6021 </h5></div></div></div>
6022 <div class="variablelist">
6023 <p class="title"><b></b></p>
6024 <dl class="variablelist">
6025 <dt><span class="term">Effects:</span></dt>
6027 Let be mtx the stored mutex*. If not 0 Invokes <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code>
6028 and gives again the <code class="computeroutput"><span class="identifier">mtx</span></code>
6029 to the <code class="computeroutput"><span class="identifier">Lock</span></code> using
6030 the <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>
6033 <dt><span class="term">Throws:</span></dt>
6035 Any exception thrown by <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code>.
6037 <dt><span class="term">Remarks:</span></dt>
6039 Note that if <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code>
6040 throws an exception while unwinding the program will terminate,
6041 so don't use reverse_lock if an exception can be thrown.
6048 <div class="section">
6049 <div class="titlepage"><div><div><h3 class="title">
6050 <a name="thread.synchronization.lock_functions"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions" title="Lock functions">Lock functions</a>
6051 </h3></div></div></div>
6052 <div class="toc"><dl class="toc">
6053 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_multiple">Non-member
6054 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt>
6055 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_range">Non-member
6056 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6057 EXTENSION</a></span></dt>
6058 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple">Non-member
6059 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt>
6060 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_range">Non-member
6061 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6062 EXTENSION</a></span></dt>
6064 <div class="section">
6065 <div class="titlepage"><div><div><h4 class="title">
6066 <a name="thread.synchronization.lock_functions.lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_multiple" title="Non-member function lock(Lockable1,Lockable2,...)">Non-member
6067 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a>
6068 </h4></div></div></div>
6069 <pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span>
6070 <span class="comment">// #include <boost/thread/lock_algorithms.hpp></span>
6071 <span class="keyword">namespace</span> <span class="identifier">boost</span>
6072 <span class="special">{</span>
6074 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">></span>
6075 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">);</span>
6077 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">></span>
6078 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">);</span>
6080 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">></span>
6081 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">);</span>
6083 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable5</span><span class="special">></span>
6084 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&</span> <span class="identifier">l5</span><span class="special">);</span>
6086 <span class="special">}</span>
6088 <div class="variablelist">
6089 <p class="title"><b></b></p>
6090 <dl class="variablelist">
6091 <dt><span class="term">Effects:</span></dt>
6093 Locks the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied
6094 as arguments in an unspecified and indeterminate order in a way that
6095 avoids deadlock. It is safe to call this function concurrently from
6096 multiple threads with the same mutexes (or other lockable objects)
6097 in different orders without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6098 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6099 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6100 an exception any locks acquired by the function will be released
6101 before the function exits.
6103 <dt><span class="term">Throws:</span></dt>
6105 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6106 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6107 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6109 <dt><span class="term">Postcondition:</span></dt>
6111 All the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked
6112 by the calling thread.
6117 <div class="section">
6118 <div class="titlepage"><div><div><h4 class="title">
6119 <a name="thread.synchronization.lock_functions.lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_range" title="Non-member function lock(begin,end) // EXTENSION">Non-member
6120 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6122 </h4></div></div></div>
6123 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">></span>
6124 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span>
6126 <div class="variablelist">
6127 <p class="title"><b></b></p>
6128 <dl class="variablelist">
6129 <dt><span class="term">Preconditions:</span></dt>
6131 The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6132 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6133 implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>
6135 <dt><span class="term">Effects:</span></dt>
6137 Locks all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6138 supplied range in an unspecified and indeterminate order in a way
6139 that avoids deadlock. It is safe to call this function concurrently
6140 from multiple threads with the same mutexes (or other lockable objects)
6141 in different orders without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6142 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6143 operations on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6144 supplied range throws an exception any locks acquired by the function
6145 will be released before the function exits.
6147 <dt><span class="term">Throws:</span></dt>
6149 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6150 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6151 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6153 <dt><span class="term">Postcondition:</span></dt>
6155 All the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6156 supplied range are locked by the calling thread.
6161 <div class="section">
6162 <div class="titlepage"><div><div><h4 class="title">
6163 <a name="thread.synchronization.lock_functions.try_lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple" title="Non-member function try_lock(Lockable1,Lockable2,...)">Non-member
6164 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a>
6165 </h4></div></div></div>
6166 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</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>
6167 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">);</span>
6169 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">></span>
6170 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">);</span>
6172 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">></span>
6173 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">);</span>
6175 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable5</span><span class="special">></span>
6176 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&</span> <span class="identifier">l5</span><span class="special">);</span>
6178 <div class="variablelist">
6179 <p class="title"><b></b></p>
6180 <dl class="variablelist">
6181 <dt><span class="term">Effects:</span></dt>
6184 Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6185 on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied
6186 as arguments. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6187 returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6188 locks acquired are released and the zero-based index of the failed
6192 If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6193 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6194 an exception any locks acquired by the function will be released
6195 before the function exits.
6198 <dt><span class="term">Returns:</span></dt>
6200 <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
6201 if all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now
6202 locked by the calling thread, the zero-based index of the object
6203 which could not be locked otherwise.
6205 <dt><span class="term">Throws:</span></dt>
6207 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6208 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6210 <dt><span class="term">Postcondition:</span></dt>
6212 If the function returns <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>, all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked
6213 by the calling thread. Otherwise any locks acquired by this function
6214 will have been released.
6219 <div class="section">
6220 <div class="titlepage"><div><div><h4 class="title">
6221 <a name="thread.synchronization.lock_functions.try_lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_range" title="Non-member function try_lock(begin,end) // EXTENSION">Non-member
6222 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6224 </h4></div></div></div>
6225 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">></span>
6226 <span class="identifier">ForwardIterator</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span>
6228 <div class="variablelist">
6229 <p class="title"><b></b></p>
6230 <dl class="variablelist">
6231 <dt><span class="term">Preconditions:</span></dt>
6233 The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6234 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6235 implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>
6237 <dt><span class="term">Effects:</span></dt>
6240 Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6241 on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6242 supplied range. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6243 returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6244 locks acquired are released and an iterator referencing the failed
6248 If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6249 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6250 an exception any locks acquired by the function will be released
6251 before the function exits.
6254 <dt><span class="term">Returns:</span></dt>
6256 <code class="computeroutput"><span class="identifier">end</span></code> if all the supplied
6257 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now
6258 locked by the calling thread, an iterator referencing the object
6259 which could not be locked otherwise.
6261 <dt><span class="term">Throws:</span></dt>
6263 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6264 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6266 <dt><span class="term">Postcondition:</span></dt>
6268 If the function returns <code class="computeroutput"><span class="identifier">end</span></code>
6269 then all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6270 supplied range are locked by the calling thread, otherwise all locks
6271 acquired by the function have been released.
6277 <div class="section">
6278 <div class="titlepage"><div><div><h3 class="title">
6279 <a name="thread.synchronization.lock_factories"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories" title="Lock Factories - EXTENSION">Lock Factories
6281 </h3></div></div></div>
6282 <div class="toc"><dl class="toc">
6283 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock">Non
6284 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a></span></dt>
6285 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t">Non
6286 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">tag</span><span class="special">)</span></code></a></span></dt>
6287 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks">Non
6288 Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...)</span></code></a></span></dt>
6290 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
6291 <span class="special">{</span>
6293 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6294 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6296 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6297 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6298 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6299 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">defer_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6300 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6301 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6303 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_NO_MAKE_UNIQUE_LOCKS</span><span class="special">)</span>
6304 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">></span>
6305 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">...></span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6306 <span class="preprocessor">#endif</span>
6307 <span class="special">}</span>
6309 <div class="section">
6310 <div class="titlepage"><div><div><h4 class="title">
6311 <a name="thread.synchronization.lock_factories.make_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock" title="Non Member Function make_unique_lock(Lockable&)">Non
6312 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a>
6313 </h4></div></div></div>
6314 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6315 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6317 <div class="variablelist">
6318 <p class="title"><b></b></p>
6319 <dl class="variablelist">
6320 <dt><span class="term">Returns:</span></dt>
6322 a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized
6323 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6325 <dt><span class="term">Throws:</span></dt>
6327 Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6332 <div class="section">
6333 <div class="titlepage"><div><div><h4 class="title">
6334 <a name="thread.synchronization.lock_factories.make_unique_lock_t"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t" title="Non Member Function make_unique_lock(Lockable&,tag)">Non
6335 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">tag</span><span class="special">)</span></code></a>
6336 </h4></div></div></div>
6337 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6338 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6340 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6341 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">defer_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6343 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span>
6344 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6346 <div class="variablelist">
6347 <p class="title"><b></b></p>
6348 <dl class="variablelist">
6349 <dt><span class="term">Returns:</span></dt>
6351 a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized
6352 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">tag</span><span class="special">)</span></code>.
6354 <dt><span class="term">Throws:</span></dt>
6356 Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">,</span>
6357 <span class="identifier">tag</span><span class="special">)</span></code>.
6362 <div class="section">
6363 <div class="titlepage"><div><div><h4 class="title">
6364 <a name="thread.synchronization.lock_factories.make_unique_locks"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks" title="Non Member Function make_unique_locks(Lockable& ...)">Non
6365 Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...)</span></code></a>
6366 </h4></div></div></div>
6367 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">></span>
6368 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">...></span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6370 <div class="variablelist">
6371 <p class="title"><b></b></p>
6372 <dl class="variablelist">
6373 <dt><span class="term">Effect:</span></dt>
6375 Locks all the mutexes.
6377 <dt><span class="term">Returns:</span></dt>
6379 a std::tuple of unique <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> owning each
6382 <dt><span class="term">Throws:</span></dt>
6384 Any exception thrown by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock</span><span class="special">(</span><span class="identifier">mtx</span><span class="special">...)</span></code>.
6390 <div class="section">
6391 <div class="titlepage"><div><div><h3 class="title">
6392 <a name="thread.synchronization.mutex_types"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types" title="Mutex Types">Mutex Types</a>
6393 </h3></div></div></div>
6394 <div class="toc"><dl class="toc">
6395 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a></span></dt>
6396 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.try_mutex">Typedef
6397 <code class="computeroutput"><span class="identifier">try_mutex</span></code></a></span></dt>
6398 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex">Class
6399 <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a></span></dt>
6400 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex">Class
6401 <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a></span></dt>
6402 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex">Typedef
6403 <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a></span></dt>
6404 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex">Class
6405 <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a></span></dt>
6406 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.shared_mutex">Class
6407 <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a></span></dt>
6408 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex">Class
6409 <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a></span></dt>
6410 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.null_mutex">Class
6411 <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a></span></dt>
6413 <div class="section">
6414 <div class="titlepage"><div><div><h4 class="title">
6415 <a name="thread.synchronization.mutex_types.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a>
6416 </h4></div></div></div>
6417 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle">Member
6418 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6419 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6421 <span class="keyword">class</span> <span class="identifier">mutex</span><span class="special">:</span>
6422 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6423 <span class="special">{</span>
6424 <span class="keyword">public</span><span class="special">:</span>
6425 <span class="identifier">mutex</span><span class="special">();</span>
6426 <span class="special">~</span><span class="identifier">mutex</span><span class="special">();</span>
6428 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6429 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6430 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6432 <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6433 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6435 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6436 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6437 <span class="special">};</span>
6440 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an
6441 exclusive-ownership mutex. At most one thread can own the lock on a given
6442 instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> at any time. Multiple concurrent
6443 calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6444 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6445 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6448 <div class="section">
6449 <div class="titlepage"><div><div><h5 class="title">
6450 <a name="thread.synchronization.mutex_types.mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle" title="Member function native_handle()">Member
6451 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6452 </h5></div></div></div>
6453 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6454 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6456 <div class="variablelist">
6457 <p class="title"><b></b></p>
6458 <dl class="variablelist">
6459 <dt><span class="term">Effects:</span></dt>
6461 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6462 that can be used with platform-specific APIs to manipulate the
6463 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6464 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6467 <dt><span class="term">Throws:</span></dt>
6475 <div class="section">
6476 <div class="titlepage"><div><div><h4 class="title">
6477 <a name="thread.synchronization.mutex_types.try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex">Typedef
6478 <code class="computeroutput"><span class="identifier">try_mutex</span></code></a>
6479 </h4></div></div></div>
6480 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6482 <span class="keyword">typedef</span> <span class="identifier">mutex</span> <span class="identifier">try_mutex</span><span class="special">;</span>
6485 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code>
6486 to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a>, provided for backwards
6487 compatibility with previous releases of boost.
6490 <div class="section">
6491 <div class="titlepage"><div><div><h4 class="title">
6492 <a name="thread.synchronization.mutex_types.timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex">Class
6493 <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a>
6494 </h4></div></div></div>
6495 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle">Member
6496 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6497 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6499 <span class="keyword">class</span> <span class="identifier">timed_mutex</span><span class="special">:</span>
6500 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6501 <span class="special">{</span>
6502 <span class="keyword">public</span><span class="special">:</span>
6503 <span class="identifier">timed_mutex</span><span class="special">();</span>
6504 <span class="special">~</span><span class="identifier">timed_mutex</span><span class="special">();</span>
6506 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6507 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6508 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6510 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
6511 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6512 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6513 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
6515 <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6516 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6518 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">timed_mutex</span><span class="special">></span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6519 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6520 <span class="keyword">typedef</span> <span class="identifier">scoped_timed_lock</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6522 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
6523 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6524 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
6525 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span>
6526 <span class="preprocessor">#endif</span>
6528 <span class="special">};</span>
6531 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide
6532 an exclusive-ownership mutex. At most one thread can own the lock on a
6533 given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> at any time. Multiple
6534 concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6535 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6536 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6537 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6538 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6541 <div class="section">
6542 <div class="titlepage"><div><div><h5 class="title">
6543 <a name="thread.synchronization.mutex_types.timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle" title="Member function native_handle()">Member
6544 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6545 </h5></div></div></div>
6546 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6547 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6549 <div class="variablelist">
6550 <p class="title"><b></b></p>
6551 <dl class="variablelist">
6552 <dt><span class="term">Effects:</span></dt>
6554 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6555 that can be used with platform-specific APIs to manipulate the
6556 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6557 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6560 <dt><span class="term">Throws:</span></dt>
6568 <div class="section">
6569 <div class="titlepage"><div><div><h4 class="title">
6570 <a name="thread.synchronization.mutex_types.recursive_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex">Class
6571 <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a>
6572 </h4></div></div></div>
6573 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle">Member
6574 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6575 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6577 <span class="keyword">class</span> <span class="identifier">recursive_mutex</span><span class="special">:</span>
6578 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6579 <span class="special">{</span>
6580 <span class="keyword">public</span><span class="special">:</span>
6581 <span class="identifier">recursive_mutex</span><span class="special">();</span>
6582 <span class="special">~</span><span class="identifier">recursive_mutex</span><span class="special">();</span>
6584 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6585 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6586 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6588 <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6589 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6591 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6592 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6593 <span class="special">};</span>
6596 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> implements the
6597 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an
6598 exclusive-ownership recursive mutex. At most one thread can own the lock
6599 on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> at any time. Multiple
6600 concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6601 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6602 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6603 shall be permitted. A thread that already has exclusive ownership of a
6604 given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> instance can call
6605 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6606 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6607 to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6608 must be called once for each level of ownership acquired by a single thread
6609 before ownership can be acquired by another thread.
6611 <div class="section">
6612 <div class="titlepage"><div><div><h5 class="title">
6613 <a name="thread.synchronization.mutex_types.recursive_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle" title="Member function native_handle()">Member
6614 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6615 </h5></div></div></div>
6616 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6617 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6619 <div class="variablelist">
6620 <p class="title"><b></b></p>
6621 <dl class="variablelist">
6622 <dt><span class="term">Effects:</span></dt>
6624 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6625 that can be used with platform-specific APIs to manipulate the
6626 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6627 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6630 <dt><span class="term">Throws:</span></dt>
6638 <div class="section">
6639 <div class="titlepage"><div><div><h4 class="title">
6640 <a name="thread.synchronization.mutex_types.recursive_try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex">Typedef
6641 <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a>
6642 </h4></div></div></div>
6643 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6645 <span class="keyword">typedef</span> <span class="identifier">recursive_mutex</span> <span class="identifier">recursive_try_mutex</span><span class="special">;</span>
6648 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code> to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a>, provided for
6649 backwards compatibility with previous releases of boost.
6652 <div class="section">
6653 <div class="titlepage"><div><div><h4 class="title">
6654 <a name="thread.synchronization.mutex_types.recursive_timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex">Class
6655 <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a>
6656 </h4></div></div></div>
6657 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle">Member
6658 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6659 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6661 <span class="keyword">class</span> <span class="identifier">recursive_timed_mutex</span><span class="special">:</span>
6662 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6663 <span class="special">{</span>
6664 <span class="keyword">public</span><span class="special">:</span>
6665 <span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6666 <span class="special">~</span><span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6668 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6669 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6670 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6673 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
6674 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6675 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6676 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
6678 <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6679 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6681 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">recursive_timed_mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6682 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6683 <span class="keyword">typedef</span> <span class="identifier">scoped_lock</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6685 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
6686 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6687 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
6688 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span>
6689 <span class="preprocessor">#endif</span>
6691 <span class="special">};</span>
6694 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> implements
6695 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide
6696 an exclusive-ownership recursive mutex. At most one thread can own the
6697 lock on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> at any time.
6698 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6699 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6700 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6701 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6702 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6703 shall be permitted. A thread that already has exclusive ownership of a
6704 given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> instance
6705 can call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6706 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6707 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6708 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6709 to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6710 must be called once for each level of ownership acquired by a single thread
6711 before ownership can be acquired by another thread.
6713 <div class="section">
6714 <div class="titlepage"><div><div><h5 class="title">
6715 <a name="thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle" title="Member function native_handle()">Member
6716 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6717 </h5></div></div></div>
6718 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6719 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6721 <div class="variablelist">
6722 <p class="title"><b></b></p>
6723 <dl class="variablelist">
6724 <dt><span class="term">Effects:</span></dt>
6726 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6727 that can be used with platform-specific APIs to manipulate the
6728 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6729 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6732 <dt><span class="term">Throws:</span></dt>
6740 <div class="section">
6741 <div class="titlepage"><div><div><h4 class="title">
6742 <a name="thread.synchronization.mutex_types.shared_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.shared_mutex" title="Class shared_mutex -- C++14">Class
6743 <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a>
6744 </h4></div></div></div>
6745 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">shared_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6747 <span class="keyword">class</span> <span class="identifier">shared_mutex</span>
6748 <span class="special">{</span>
6749 <span class="keyword">public</span><span class="special">:</span>
6750 <span class="identifier">shared_mutex</span><span class="special">(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6751 <span class="identifier">shared_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6753 <span class="identifier">shared_mutex</span><span class="special">();</span>
6754 <span class="special">~</span><span class="identifier">shared_mutex</span><span class="special">();</span>
6756 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6757 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6758 <span class="keyword">template</span> <span class="special"><</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>
6759 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6760 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6761 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6762 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6764 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6765 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6766 <span class="keyword">template</span> <span class="special"><</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>
6767 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6768 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6769 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6770 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6772 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
6773 <span class="comment">// use upgrade_mutex instead.</span>
6774 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6775 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6777 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6778 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6779 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6780 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6781 <span class="preprocessor">#endif</span>
6783 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
6784 <span class="keyword">bool</span> <span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6785 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6786 <span class="preprocessor">#endif</span>
6788 <span class="special">};</span>
6791 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_mutex</span></code> provides an implementation
6792 of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>.
6795 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6796 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6797 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>,
6798 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>,
6799 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6800 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
6801 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>,
6802 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>,
6803 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
6804 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
6808 Note the the lack of reader-writer priority policies in shared_mutex. This
6809 is due to an algorithm credited to Alexander Terekhov which lets the OS
6810 decide which thread is the next to get the lock without caring whether
6811 a unique lock or shared lock is being sought. This results in a complete
6812 lack of reader or writer starvation. It is simply fair.
6815 <div class="section">
6816 <div class="titlepage"><div><div><h4 class="title">
6817 <a name="thread.synchronization.mutex_types.upgrade_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex" title="Class upgrade_mutex -- EXTENSION">Class
6818 <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a>
6819 </h4></div></div></div>
6820 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">shared_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6822 <span class="keyword">class</span> <span class="identifier">upgrade_mutex</span>
6823 <span class="special">{</span>
6824 <span class="keyword">public</span><span class="special">:</span>
6825 <span class="identifier">upgrade_mutex</span><span class="special">(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6826 <span class="identifier">upgrade_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6828 <span class="identifier">upgrade_mutex</span><span class="special">();</span>
6829 <span class="special">~</span><span class="identifier">upgrade_mutex</span><span class="special">();</span>
6831 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6832 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6833 <span class="keyword">template</span> <span class="special"><</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>
6834 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6835 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6836 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6837 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6839 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6840 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6841 <span class="keyword">template</span> <span class="special"><</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>
6842 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6843 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6844 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6845 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6847 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6848 <span class="keyword">template</span> <span class="special"><</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>
6849 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6850 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6851 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6852 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6854 <span class="comment">// Shared <-> Exclusive</span>
6856 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6857 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6858 <span class="keyword">template</span> <span class="special"><</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>
6859 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6860 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6861 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6862 <span class="preprocessor">#endif</span>
6863 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6865 <span class="comment">// Shared <-> Upgrade</span>
6867 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6868 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6869 <span class="keyword">template</span> <span class="special"><</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>
6870 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6871 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6872 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6873 <span class="preprocessor">#endif</span>
6874 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6876 <span class="comment">// Upgrade <-> Exclusive</span>
6878 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6879 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_PTHREAD</span><span class="special">)</span>
6880 <span class="special">||</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span><span class="special">)</span>
6881 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6882 <span class="keyword">template</span> <span class="special"><</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>
6883 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6884 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6885 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6886 <span class="preprocessor">#endif</span>
6887 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6888 <span class="special">};</span>
6891 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_mutex</span></code> provides an implementation
6892 of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a>.
6895 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6896 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6897 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>,
6898 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>,
6899 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6900 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
6901 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>,
6902 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>,
6903 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
6904 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
6908 <div class="section">
6909 <div class="titlepage"><div><div><h4 class="title">
6910 <a name="thread.synchronization.mutex_types.null_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.null_mutex" title="Class null_mutex -- EXTENSION">Class
6911 <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a>
6912 </h4></div></div></div>
6913 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">null_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6915 <span class="keyword">class</span> <span class="identifier">null_mutex</span>
6916 <span class="special">{</span>
6917 <span class="keyword">public</span><span class="special">:</span>
6918 <span class="identifier">null_mutex</span><span class="special">(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6919 <span class="identifier">null_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6921 <span class="identifier">null_mutex</span><span class="special">();</span>
6922 <span class="special">~</span><span class="identifier">null_mutex</span><span class="special">();</span>
6924 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6925 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6926 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6927 <span class="keyword">template</span> <span class="special"><</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>
6928 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6929 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6930 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6931 <span class="preprocessor">#endif</span>
6932 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6934 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6935 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6936 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6937 <span class="keyword">template</span> <span class="special"><</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>
6938 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6939 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6940 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6941 <span class="preprocessor">#endif</span>
6942 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6944 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6945 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6946 <span class="keyword">template</span> <span class="special"><</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>
6947 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6948 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6949 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6950 <span class="preprocessor">#endif</span>
6951 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6953 <span class="comment">// Shared <-> Exclusive</span>
6955 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6956 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6957 <span class="keyword">template</span> <span class="special"><</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>
6958 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6959 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6960 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6961 <span class="preprocessor">#endif</span>
6962 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6964 <span class="comment">// Shared <-> Upgrade</span>
6966 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6967 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6968 <span class="keyword">template</span> <span class="special"><</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>
6969 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6970 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6971 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6972 <span class="preprocessor">#endif</span>
6973 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6975 <span class="comment">// Upgrade <-> Exclusive</span>
6977 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6978 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6979 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6980 <span class="keyword">template</span> <span class="special"><</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>
6981 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
6982 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
6983 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
6984 <span class="preprocessor">#endif</span>
6985 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6986 <span class="special">};</span>
6989 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">null_mutex</span></code> provides a no-op implementation
6990 of a multiple-reader / single-writer mutex. It is a model of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> concept.
6994 <div class="section">
6995 <div class="titlepage"><div><div><h3 class="title">
6996 <a name="thread.synchronization.condvar_ref"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref" title="Condition Variables">Condition Variables</a>
6997 </h3></div></div></div>
6998 <div class="toc"><dl class="toc">
6999 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable">Class
7000 <code class="computeroutput"><span class="identifier">condition_variable</span></code></a></span></dt>
7001 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any">Class
7002 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a></span></dt>
7003 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition">Typedef
7004 <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a></span></dt>
7005 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit">Non-member
7006 Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a></span></dt>
7009 <a name="thread.synchronization.condvar_ref.h0"></a>
7010 <span class="phrase"><a name="thread.synchronization.condvar_ref.synopsis"></a></span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.synopsis">Synopsis</a>
7012 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
7013 <span class="special">{</span>
7014 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">cv_status</span><span class="special">;</span>
7015 <span class="special">{</span>
7016 <span class="identifier">no_timeout</span><span class="special">,</span>
7017 <span class="identifier">timeout</span>
7018 <span class="special">};</span>
7019 <span class="keyword">class</span> <span class="identifier">condition_variable</span><span class="special">;</span>
7020 <span class="keyword">class</span> <span class="identifier">condition_variable_any</span><span class="special">;</span>
7021 <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">);</span>
7022 <span class="special">}</span>
7025 The classes <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7026 and <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7027 provide a mechanism for one thread to wait for notification from another
7028 thread that a particular condition has become true. The general usage pattern
7029 is that one thread locks a mutex and then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7030 on an instance of <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7031 or <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7032 When the thread is woken from the wait, then it checks to see if the appropriate
7033 condition is now true, and continues if so. If the condition is not true,
7034 then the thread then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7035 again to resume waiting. In the simplest case, this condition is just a boolean
7038 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cond</span><span class="special">;</span>
7039 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mut</span><span class="special">;</span>
7040 <span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
7042 <span class="keyword">void</span> <span class="identifier">process_data</span><span class="special">();</span>
7044 <span class="keyword">void</span> <span class="identifier">wait_for_data_to_process</span><span class="special">()</span>
7045 <span class="special">{</span>
7046 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span>
7047 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
7048 <span class="special">{</span>
7049 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7050 <span class="special">}</span>
7051 <span class="identifier">process_data</span><span class="special">();</span>
7052 <span class="special">}</span>
7055 Notice that the <code class="computeroutput"><span class="identifier">lock</span></code> is passed
7056 to <code class="computeroutput"><span class="identifier">wait</span></code>: <code class="computeroutput"><span class="identifier">wait</span></code>
7057 will atomically add the thread to the set of threads waiting on the condition
7058 variable, and unlock the mutex. When the thread is woken, the mutex will
7059 be locked again before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7060 returns. This allows other threads to acquire the mutex in order to update
7061 the shared data, and ensures that the data associated with the condition
7062 is correctly synchronized.
7065 In the mean time, another thread sets the condition to <code class="computeroutput"><span class="keyword">true</span></code>,
7066 and then calls either <code class="computeroutput"><span class="identifier">notify_one</span></code>
7067 or <code class="computeroutput"><span class="identifier">notify_all</span></code> on the condition
7068 variable to wake one waiting thread or all the waiting threads respectively.
7070 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">retrieve_data</span><span class="special">();</span>
7071 <span class="keyword">void</span> <span class="identifier">prepare_data</span><span class="special">();</span>
7073 <span class="keyword">void</span> <span class="identifier">prepare_data_for_processing</span><span class="special">()</span>
7074 <span class="special">{</span>
7075 <span class="identifier">retrieve_data</span><span class="special">();</span>
7076 <span class="identifier">prepare_data</span><span class="special">();</span>
7077 <span class="special">{</span>
7078 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span>
7079 <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
7080 <span class="special">}</span>
7081 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_one</span><span class="special">();</span>
7082 <span class="special">}</span>
7085 Note that the same mutex is locked before the shared data is updated, but
7086 that the mutex does not have to be locked across the call to <code class="computeroutput"><span class="identifier">notify_one</span></code>.
7089 This example uses an object of type <code class="computeroutput"><span class="identifier">condition_variable</span></code>,
7090 but would work just as well with an object of type <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>:
7091 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> is
7092 more general, and will work with any kind of lock or mutex, whereas <code class="computeroutput"><span class="identifier">condition_variable</span></code> requires that the lock
7093 passed to <code class="computeroutput"><span class="identifier">wait</span></code> is an instance
7094 of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span></code>.
7095 This enables <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7096 to make optimizations in some cases, based on the knowledge of the mutex
7097 type; <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7098 typically has a more complex implementation than <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7100 <div class="section">
7101 <div class="titlepage"><div><div><h4 class="title">
7102 <a name="thread.synchronization.condvar_ref.condition_variable"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable" title="Class condition_variable">Class
7103 <code class="computeroutput"><span class="identifier">condition_variable</span></code></a>
7104 </h4></div></div></div>
7105 <div class="toc"><dl class="toc">
7106 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt>
7107 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt>
7108 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt>
7109 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt>
7110 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt>
7111 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7112 <span class="identifier">lock</span><span class="special">,</span>
7113 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7114 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span>
7115 <span class="keyword">const</span><span class="special">&</span>
7116 <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7117 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7118 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7119 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7120 <span class="identifier">lock</span><span class="special">,</span>
7121 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7122 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7123 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</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>
7124 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span>
7125 <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7126 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</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>
7127 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span>
7128 <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7129 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7130 <span class="identifier">lock</span><span class="special">,</span>
7131 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7132 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7133 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7134 <span class="identifier">lock</span><span class="special">,</span>
7135 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7136 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7138 <pre class="programlisting"><span class="comment">//#include <boost/thread/condition_variable.hpp></span>
7140 <span class="keyword">namespace</span> <span class="identifier">boost</span>
7141 <span class="special">{</span>
7142 <span class="keyword">class</span> <span class="identifier">condition_variable</span>
7143 <span class="special">{</span>
7144 <span class="keyword">public</span><span class="special">:</span>
7145 <span class="identifier">condition_variable</span><span class="special">();</span>
7146 <span class="special">~</span><span class="identifier">condition_variable</span><span class="special">();</span>
7148 <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7149 <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7151 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">);</span>
7153 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7154 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7156 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
7157 <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7158 <span class="identifier">wait_until</span><span class="special">(</span>
7159 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span>
7160 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
7162 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7163 <span class="keyword">bool</span>
7164 <span class="identifier">wait_until</span><span class="special">(</span>
7165 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span>
7166 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">,</span>
7167 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7169 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
7170 <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7171 <span class="identifier">wait_for</span><span class="special">(</span>
7172 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span>
7173 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">);</span>
7175 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7176 <span class="keyword">bool</span>
7177 <span class="identifier">wait_for</span><span class="special">(</span>
7178 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span>
7179 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">,</span>
7180 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7182 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7183 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
7184 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span>
7185 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
7186 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7187 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7188 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7189 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7190 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
7192 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7193 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7194 <span class="preprocessor">#endif</span>
7196 <span class="special">};</span>
7197 <span class="special">}</span>
7199 <div class="section">
7200 <div class="titlepage"><div><div><h5 class="title">
7201 <a name="thread.synchronization.condvar_ref.condition_variable.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor" title="condition_variable()"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a>
7202 </h5></div></div></div>
7203 <div class="variablelist">
7204 <p class="title"><b></b></p>
7205 <dl class="variablelist">
7206 <dt><span class="term">Effects:</span></dt>
7208 Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7210 <dt><span class="term">Throws:</span></dt>
7212 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7218 <div class="section">
7219 <div class="titlepage"><div><div><h5 class="title">
7220 <a name="thread.synchronization.condvar_ref.condition_variable.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor" title="~condition_variable()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a>
7221 </h5></div></div></div>
7222 <div class="variablelist">
7223 <p class="title"><b></b></p>
7224 <dl class="variablelist">
7225 <dt><span class="term">Precondition:</span></dt>
7227 All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7228 to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7229 <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7230 the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7231 or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7234 <dt><span class="term">Effects:</span></dt>
7236 Destroys the object.
7238 <dt><span class="term">Throws:</span></dt>
7245 <div class="section">
7246 <div class="titlepage"><div><div><h5 class="title">
7247 <a name="thread.synchronization.condvar_ref.condition_variable.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a>
7248 </h5></div></div></div>
7249 <div class="variablelist">
7250 <p class="title"><b></b></p>
7251 <dl class="variablelist">
7252 <dt><span class="term">Effects:</span></dt>
7254 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7255 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7256 in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7257 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7258 unblocks one of those threads.
7260 <dt><span class="term">Throws:</span></dt>
7267 <div class="section">
7268 <div class="titlepage"><div><div><h5 class="title">
7269 <a name="thread.synchronization.condvar_ref.condition_variable.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a>
7270 </h5></div></div></div>
7271 <div class="variablelist">
7272 <p class="title"><b></b></p>
7273 <dl class="variablelist">
7274 <dt><span class="term">Effects:</span></dt>
7276 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7277 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7278 in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7279 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7280 unblocks all of those threads.
7282 <dt><span class="term">Throws:</span></dt>
7289 <div class="section">
7290 <div class="titlepage"><div><div><h5 class="title">
7291 <a name="thread.synchronization.condvar_ref.condition_variable.wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait" title="void wait(boost::unique_lock<boost::mutex>& lock)"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span></code></a>
7292 </h5></div></div></div>
7293 <div class="variablelist">
7294 <p class="title"><b></b></p>
7295 <dl class="variablelist">
7296 <dt><span class="term">Precondition:</span></dt>
7298 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7299 by the current thread, and either no other thread is currently
7300 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7301 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7302 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7303 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7304 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7305 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code>
7306 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7308 <dt><span class="term">Effects:</span></dt>
7310 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7311 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7312 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7313 or spuriously. When the thread is unblocked (for whatever reason),
7314 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7315 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7318 <dt><span class="term">Postcondition:</span></dt>
7320 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7321 by the current thread.
7323 <dt><span class="term">Throws:</span></dt>
7325 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7326 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7327 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7328 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7329 with the current thread of execution.
7334 <div class="section">
7335 <div class="titlepage"><div><div><h5 class="title">
7336 <a name="thread.synchronization.condvar_ref.condition_variable.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate" title="template<typename predicate_type> void wait(boost::unique_lock<boost::mutex>& lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7337 <span class="identifier">lock</span><span class="special">,</span>
7338 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
7339 </h5></div></div></div>
7340 <div class="variablelist">
7341 <p class="title"><b></b></p>
7342 <dl class="variablelist">
7343 <dt><span class="term">Effects:</span></dt>
7348 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7349 <span class="special">{</span>
7350 <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7351 <span class="special">}</span>
7359 <div class="section">
7360 <div class="titlepage"><div><div><h5 class="title">
7361 <a name="thread.synchronization.condvar_ref.condition_variable.timed_wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait" title="bool timed_wait(boost::unique_lock<boost::mutex>& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span>
7362 <span class="keyword">const</span><span class="special">&</span>
7363 <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7364 </h5></div></div></div>
7365 <div class="variablelist">
7366 <p class="title"><b></b></p>
7367 <dl class="variablelist">
7368 <dt><span class="term">Precondition:</span></dt>
7370 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7371 by the current thread, and either no other thread is currently
7372 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7373 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7374 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7375 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7376 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7377 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code>
7378 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7380 <dt><span class="term">Effects:</span></dt>
7382 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7383 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7384 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7385 when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than
7386 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7387 or spuriously. When the thread is unblocked (for whatever reason),
7388 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7389 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7392 <dt><span class="term">Returns:</span></dt>
7394 <code class="computeroutput"><span class="keyword">false</span></code> if the call
7395 is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7396 was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7399 <dt><span class="term">Postcondition:</span></dt>
7401 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7402 by the current thread.
7404 <dt><span class="term">Throws:</span></dt>
7406 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7407 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7408 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7409 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7410 with the current thread of execution.
7415 <div class="section">
7416 <div class="titlepage"><div><div><h5 class="title">
7417 <a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel" title="template<typename duration_type> bool timed_wait(boost::unique_lock<boost::mutex>& lock,duration_type const& rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7418 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7419 </h5></div></div></div>
7420 <div class="variablelist">
7421 <p class="title"><b></b></p>
7422 <dl class="variablelist">
7423 <dt><span class="term">Precondition:</span></dt>
7425 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7426 by the current thread, and either no other thread is currently
7427 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7428 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7429 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7430 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7431 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7432 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code>
7433 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7435 <dt><span class="term">Effects:</span></dt>
7437 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7438 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7439 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7440 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7441 argument has elapsed, or spuriously. When the thread is unblocked
7442 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7443 before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7444 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7445 if the function exits with an exception.
7447 <dt><span class="term">Returns:</span></dt>
7449 <code class="computeroutput"><span class="keyword">false</span></code> if the call
7450 is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise.
7452 <dt><span class="term">Postcondition:</span></dt>
7454 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7455 by the current thread.
7457 <dt><span class="term">Throws:</span></dt>
7459 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7460 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7461 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7462 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7463 with the current thread of execution.
7467 <div class="note"><table border="0" summary="Note">
7469 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7470 <th align="left">Note</th>
7472 <tr><td align="left" valign="top"><p>
7473 The duration overload of timed_wait is difficult to use correctly.
7474 The overload taking a predicate should be preferred in most cases.
7478 <div class="section">
7479 <div class="titlepage"><div><div><h5 class="title">
7480 <a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate" title="template<typename predicate_type> bool timed_wait(boost::unique_lock<boost::mutex>& lock, boost::system_time const& abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7481 <span class="identifier">lock</span><span class="special">,</span>
7482 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7483 <span class="identifier">pred</span><span class="special">)</span></code></a>
7484 </h5></div></div></div>
7485 <div class="variablelist">
7486 <p class="title"><b></b></p>
7487 <dl class="variablelist">
7488 <dt><span class="term">Effects:</span></dt>
7493 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7494 <span class="special">{</span>
7495 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
7496 <span class="special">{</span>
7497 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7498 <span class="special">}</span>
7499 <span class="special">}</span>
7500 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7508 <div class="section">
7509 <div class="titlepage"><div><div><h5 class="title">
7510 <a name="thread.synchronization.condvar_ref.condition_variable.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template <class Clock, class Duration> cv_status wait_until(boost::unique_lock<boost::mutex>& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
7511 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span>
7512 <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7513 </h5></div></div></div>
7514 <div class="variablelist">
7515 <p class="title"><b></b></p>
7516 <dl class="variablelist">
7517 <dt><span class="term">Precondition:</span></dt>
7519 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7520 by the current thread, and either no other thread is currently
7521 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7522 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7523 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7524 <code class="computeroutput"><span class="identifier">wait_for</span></code> or <code class="computeroutput"><span class="identifier">wait_until</span></code> in all the threads
7525 currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7526 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code>
7527 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7529 <dt><span class="term">Effects:</span></dt>
7531 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7532 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7533 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7534 when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than
7535 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7536 or spuriously. When the thread is unblocked (for whatever reason),
7537 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7538 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7541 <dt><span class="term">Returns:</span></dt>
7543 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
7544 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7545 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
7548 <dt><span class="term">Postcondition:</span></dt>
7550 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7551 by the current thread.
7553 <dt><span class="term">Throws:</span></dt>
7555 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7556 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7557 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7558 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7559 with the current thread of execution.
7564 <div class="section">
7565 <div class="titlepage"><div><div><h5 class="title">
7566 <a name="thread.synchronization.condvar_ref.condition_variable.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template <class Rep, class Period> cv_status wait_for(boost::unique_lock<boost::mutex>& lock, const chrono::duration<Rep, Period>& rel_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
7567 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span>
7568 <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7569 </h5></div></div></div>
7570 <div class="variablelist">
7571 <p class="title"><b></b></p>
7572 <dl class="variablelist">
7573 <dt><span class="term">Precondition:</span></dt>
7575 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7576 by the current thread, and either no other thread is currently
7577 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7578 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7579 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7580 <code class="computeroutput"><span class="identifier">wait_until</span></code> or
7581 <code class="computeroutput"><span class="identifier">wait_for</span></code> in all
7582 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7583 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code>
7584 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7586 <dt><span class="term">Effects:</span></dt>
7588 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7589 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7590 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7591 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7592 argument has elapsed, or spuriously. When the thread is unblocked
7593 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7594 before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7595 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7596 if the function exits with an exception.
7598 <dt><span class="term">Returns:</span></dt>
7600 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span> </code> if the call is returning
7601 because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
7602 has elapsed, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span>
7605 <dt><span class="term">Postcondition:</span></dt>
7607 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7608 by the current thread.
7610 <dt><span class="term">Throws:</span></dt>
7612 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7613 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7614 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7615 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7616 with the current thread of execution.
7620 <div class="note"><table border="0" summary="Note">
7622 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7623 <th align="left">Note</th>
7625 <tr><td align="left" valign="top"><p>
7626 The duration overload of timed_wait is difficult to use correctly.
7627 The overload taking a predicate should be preferred in most cases.
7631 <div class="section">
7632 <div class="titlepage"><div><div><h5 class="title">
7633 <a name="thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate" title="template <class Clock, class Duration, class Predicate> bool wait_until(boost::unique_lock<boost::mutex>& lock, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7634 <span class="identifier">lock</span><span class="special">,</span>
7635 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7636 <span class="identifier">pred</span><span class="special">)</span></code></a>
7637 </h5></div></div></div>
7638 <div class="variablelist">
7639 <p class="title"><b></b></p>
7640 <dl class="variablelist">
7641 <dt><span class="term">Effects:</span></dt>
7646 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7647 <span class="special">{</span>
7648 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
7649 <span class="special">{</span>
7650 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7651 <span class="special">}</span>
7652 <span class="special">}</span>
7653 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7661 <div class="section">
7662 <div class="titlepage"><div><div><h5 class="title">
7663 <a name="thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate" title="template <class Rep, class Period, class Predicate> bool wait_for(boost::unique_lock<boost::mutex>& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span>
7664 <span class="identifier">lock</span><span class="special">,</span>
7665 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7666 <span class="identifier">pred</span><span class="special">)</span></code></a>
7667 </h5></div></div></div>
7668 <div class="variablelist">
7669 <p class="title"><b></b></p>
7670 <dl class="variablelist">
7671 <dt><span class="term">Effects:</span></dt>
7676 <pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pred</span><span class="special">));</span>
7685 <div class="section">
7686 <div class="titlepage"><div><div><h4 class="title">
7687 <a name="thread.synchronization.condvar_ref.condition_variable_any"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any" title="Class condition_variable_any">Class
7688 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a>
7689 </h4></div></div></div>
7690 <div class="toc"><dl class="toc">
7691 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt>
7692 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt>
7693 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt>
7694 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt>
7695 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7696 <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt>
7697 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7698 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7699 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7700 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7701 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7702 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</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>
7703 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7704 <span class="keyword">const</span><span class="special">&</span>
7705 <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7706 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7707 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span>
7708 <span class="keyword">const</span><span class="special">&</span>
7709 <span class="identifier">abs_time</span><span class="special">,</span>
7710 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7711 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> <span class="identifier">cv_status</span>
7712 <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7713 <span class="identifier">lock</span><span class="special">,</span>
7714 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7715 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">cv_status</span>
7716 <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7717 <span class="identifier">lock</span><span class="special">,</span>
7718 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7719 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7720 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span>
7721 <span class="identifier">abs_time</span><span class="special">,</span>
7722 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7723 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7724 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span>
7725 <span class="identifier">rel_time</span><span class="special">,</span>
7726 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7728 <pre class="programlisting"><span class="comment">//#include <boost/thread/condition_variable.hpp></span>
7730 <span class="keyword">namespace</span> <span class="identifier">boost</span>
7731 <span class="special">{</span>
7732 <span class="keyword">class</span> <span class="identifier">condition_variable_any</span>
7733 <span class="special">{</span>
7734 <span class="keyword">public</span><span class="special">:</span>
7735 <span class="identifier">condition_variable_any</span><span class="special">();</span>
7736 <span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">();</span>
7738 <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">();</span>
7739 <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">();</span>
7741 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span>
7742 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">);</span>
7744 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7745 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7747 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
7748 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span>
7749 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span>
7750 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span>
7752 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7753 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span>
7754 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span>
7755 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">,</span>
7756 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7759 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
7760 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span>
7761 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span>
7762 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">);</span>
7764 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
7765 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span>
7766 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span>
7767 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">,</span>
7768 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7770 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7771 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span>
7772 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
7773 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span>
7774 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
7775 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7776 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7777 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7778 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7779 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span>
7780 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
7781 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7782 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span>
7783 <span class="preprocessor">#endif</span>
7784 <span class="special">};</span>
7785 <span class="special">}</span>
7787 <div class="section">
7788 <div class="titlepage"><div><div><h5 class="title">
7789 <a name="thread.synchronization.condvar_ref.condition_variable_any.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor" title="condition_variable_any()"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a>
7790 </h5></div></div></div>
7791 <div class="variablelist">
7792 <p class="title"><b></b></p>
7793 <dl class="variablelist">
7794 <dt><span class="term">Effects:</span></dt>
7796 Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7798 <dt><span class="term">Throws:</span></dt>
7800 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7806 <div class="section">
7807 <div class="titlepage"><div><div><h5 class="title">
7808 <a name="thread.synchronization.condvar_ref.condition_variable_any.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor" title="~condition_variable_any()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a>
7809 </h5></div></div></div>
7810 <div class="variablelist">
7811 <p class="title"><b></b></p>
7812 <dl class="variablelist">
7813 <dt><span class="term">Precondition:</span></dt>
7815 All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7816 to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7817 <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7818 the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7819 or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7822 <dt><span class="term">Effects:</span></dt>
7824 Destroys the object.
7826 <dt><span class="term">Throws:</span></dt>
7833 <div class="section">
7834 <div class="titlepage"><div><div><h5 class="title">
7835 <a name="thread.synchronization.condvar_ref.condition_variable_any.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a>
7836 </h5></div></div></div>
7837 <div class="variablelist">
7838 <p class="title"><b></b></p>
7839 <dl class="variablelist">
7840 <dt><span class="term">Effects:</span></dt>
7842 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7843 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7844 in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7845 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7846 unblocks one of those threads.
7848 <dt><span class="term">Throws:</span></dt>
7855 <div class="section">
7856 <div class="titlepage"><div><div><h5 class="title">
7857 <a name="thread.synchronization.condvar_ref.condition_variable_any.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a>
7858 </h5></div></div></div>
7859 <div class="variablelist">
7860 <p class="title"><b></b></p>
7861 <dl class="variablelist">
7862 <dt><span class="term">Effects:</span></dt>
7864 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7865 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7866 in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7867 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7868 unblocks all of those threads.
7870 <dt><span class="term">Throws:</span></dt>
7877 <div class="section">
7878 <div class="titlepage"><div><div><h5 class="title">
7879 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait" title="template<typename lock_type> void wait(lock_type& lock)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7880 <span class="identifier">lock</span><span class="special">)</span></code></a>
7881 </h5></div></div></div>
7882 <div class="variablelist">
7883 <p class="title"><b></b></p>
7884 <dl class="variablelist">
7885 <dt><span class="term">Effects:</span></dt>
7887 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7888 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7889 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7890 or spuriously. When the thread is unblocked (for whatever reason),
7891 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7892 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7895 <dt><span class="term">Postcondition:</span></dt>
7897 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7898 by the current thread.
7900 <dt><span class="term">Throws:</span></dt>
7902 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7903 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7904 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7905 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7906 with the current thread of execution.
7911 <div class="section">
7912 <div class="titlepage"><div><div><h5 class="title">
7913 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate" title="template<typename lock_type,typename predicate_type> void wait(lock_type& lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
7914 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7915 <span class="identifier">pred</span><span class="special">)</span></code></a>
7916 </h5></div></div></div>
7917 <div class="variablelist">
7918 <p class="title"><b></b></p>
7919 <dl class="variablelist">
7920 <dt><span class="term">Effects:</span></dt>
7925 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7926 <span class="special">{</span>
7927 <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7928 <span class="special">}</span>
7936 <div class="section">
7937 <div class="titlepage"><div><div><h5 class="title">
7938 <a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait" title="template<typename lock_type> bool timed_wait(lock_type& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
7939 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7940 </h5></div></div></div>
7941 <div class="variablelist">
7942 <p class="title"><b></b></p>
7943 <dl class="variablelist">
7944 <dt><span class="term">Effects:</span></dt>
7946 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7947 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7948 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7949 when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than
7950 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7951 or spuriously. When the thread is unblocked (for whatever reason),
7952 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7953 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7956 <dt><span class="term">Returns:</span></dt>
7958 <code class="computeroutput"><span class="keyword">false</span></code> if the call
7959 is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7960 was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7963 <dt><span class="term">Postcondition:</span></dt>
7965 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7966 by the current thread.
7968 <dt><span class="term">Throws:</span></dt>
7970 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7971 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7972 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7973 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7974 with the current thread of execution.
7979 <div class="section">
7980 <div class="titlepage"><div><div><h5 class="title">
7981 <a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel" title="template<typename lock_type,typename duration_type> bool timed_wait(lock_type& lock,duration_type const& rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span>
7982 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7983 <span class="keyword">const</span><span class="special">&</span>
7984 <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7985 </h5></div></div></div>
7986 <div class="variablelist">
7987 <p class="title"><b></b></p>
7988 <dl class="variablelist">
7989 <dt><span class="term">Effects:</span></dt>
7991 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7992 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
7993 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7994 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7995 argument has elapsed, or spuriously. When the thread is unblocked
7996 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7997 before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7998 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7999 if the function exits with an exception.
8001 <dt><span class="term">Returns:</span></dt>
8003 <code class="computeroutput"><span class="keyword">false</span></code> if the call
8004 is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise.
8006 <dt><span class="term">Postcondition:</span></dt>
8008 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8009 by the current thread.
8011 <dt><span class="term">Throws:</span></dt>
8013 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8014 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8015 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8016 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8017 with the current thread of execution.
8021 <div class="note"><table border="0" summary="Note">
8023 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8024 <th align="left">Note</th>
8026 <tr><td align="left" valign="top"><p>
8027 The duration overload of timed_wait is difficult to use correctly.
8028 The overload taking a predicate should be preferred in most cases.
8032 <div class="section">
8033 <div class="titlepage"><div><div><h5 class="title">
8034 <a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate" title="template<typename lock_type,typename predicate_type> bool timed_wait(lock_type& lock, boost::system_time const& abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span>
8035 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span>
8036 <span class="keyword">const</span><span class="special">&</span>
8037 <span class="identifier">abs_time</span><span class="special">,</span>
8038 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8039 </h5></div></div></div>
8040 <div class="variablelist">
8041 <p class="title"><b></b></p>
8042 <dl class="variablelist">
8043 <dt><span class="term">Effects:</span></dt>
8048 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8049 <span class="special">{</span>
8050 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
8051 <span class="special">{</span>
8052 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8053 <span class="special">}</span>
8054 <span class="special">}</span>
8055 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8063 <div class="section">
8064 <div class="titlepage"><div><div><h5 class="title">
8065 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until" title="template <class lock_type, class Clock, class Duration> cv_status wait_until(lock_type& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> <span class="identifier">cv_status</span>
8066 <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
8067 <span class="identifier">lock</span><span class="special">,</span>
8068 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
8069 </h5></div></div></div>
8070 <div class="variablelist">
8071 <p class="title"><b></b></p>
8072 <dl class="variablelist">
8073 <dt><span class="term">Effects:</span></dt>
8075 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
8076 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
8077 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8078 when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than
8079 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
8080 or spuriously. When the thread is unblocked (for whatever reason),
8081 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
8082 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
8085 <dt><span class="term">Returns:</span></dt>
8087 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8088 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8089 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8092 <dt><span class="term">Postcondition:</span></dt>
8094 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8095 by the current thread.
8097 <dt><span class="term">Throws:</span></dt>
8099 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8100 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8101 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8102 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8103 with the current thread of execution.
8108 <div class="section">
8109 <div class="titlepage"><div><div><h5 class="title">
8110 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for" title="template <class lock_type, class Rep, class Period> cv_status wait_for(lock_type& lock, const chrono::duration<Rep, Period>& rel_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">cv_status</span>
8111 <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span>
8112 <span class="identifier">lock</span><span class="special">,</span>
8113 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a>
8114 </h5></div></div></div>
8115 <div class="variablelist">
8116 <p class="title"><b></b></p>
8117 <dl class="variablelist">
8118 <dt><span class="term">Effects:</span></dt>
8120 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
8121 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code>
8122 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8123 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
8124 argument has elapsed, or spuriously. When the thread is unblocked
8125 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
8126 before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
8127 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
8128 if the function exits with an exception.
8130 <dt><span class="term">Returns:</span></dt>
8132 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8133 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8134 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8137 <dt><span class="term">Postcondition:</span></dt>
8139 <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8140 by the current thread.
8142 <dt><span class="term">Throws:</span></dt>
8144 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8145 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8146 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8147 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8148 with the current thread of execution.
8152 <div class="note"><table border="0" summary="Note">
8154 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8155 <th align="left">Note</th>
8157 <tr><td align="left" valign="top"><p>
8158 The duration overload of timed_wait is difficult to use correctly.
8159 The overload taking a predicate should be preferred in most cases.
8163 <div class="section">
8164 <div class="titlepage"><div><div><h5 class="title">
8165 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate" title="template <class lock_type, class Clock, class Duration, class Predicate> bool wait_until(lock_type& lock, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
8166 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span>
8167 <span class="identifier">abs_time</span><span class="special">,</span>
8168 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8169 </h5></div></div></div>
8170 <div class="variablelist">
8171 <p class="title"><b></b></p>
8172 <dl class="variablelist">
8173 <dt><span class="term">Effects:</span></dt>
8178 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8179 <span class="special">{</span>
8180 <span class="keyword">if</span><span class="special">(!</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until" title="template <class lock_type, class Clock, class Duration> cv_status wait_until(lock_type& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="identifier">wait_until</span></code></a><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
8181 <span class="special">{</span>
8182 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8183 <span class="special">}</span>
8184 <span class="special">}</span>
8185 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8193 <div class="section">
8194 <div class="titlepage"><div><div><h5 class="title">
8195 <a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate" title="template <class lock_type, class Rep, class Period, class Predicate> bool wait_for(lock_type& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span>
8196 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span>
8197 <span class="identifier">rel_time</span><span class="special">,</span>
8198 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8199 </h5></div></div></div>
8200 <div class="variablelist">
8201 <p class="title"><b></b></p>
8202 <dl class="variablelist">
8203 <dt><span class="term">Effects:</span></dt>
8208 <pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pred</span><span class="special">));</span>
8217 <div class="section">
8218 <div class="titlepage"><div><div><h4 class="title">
8219 <a name="thread.synchronization.condvar_ref.condition"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition" title="Typedef condition DEPRECATED V3">Typedef
8220 <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a>
8221 </h4></div></div></div>
8222 <pre class="programlisting"><span class="comment">// #include <boost/thread/condition.hpp></span>
8223 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8224 <span class="special">{</span>
8226 <span class="keyword">typedef</span> <span class="identifier">condition_variable_any</span> <span class="identifier">condition</span><span class="special">;</span>
8228 <span class="special">}</span>
8231 The typedef <code class="computeroutput"><span class="identifier">condition</span></code> is
8232 provided for backwards compatibility with previous boost releases.
8235 <div class="section">
8236 <div class="titlepage"><div><div><h4 class="title">
8237 <a name="thread.synchronization.condvar_ref.notify_all_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit" title="Non-member Function notify_all_at_thread_exit()">Non-member
8238 Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a>
8239 </h4></div></div></div>
8240 <pre class="programlisting"><span class="comment">// #include <boost/thread/condition_variable.hpp></span>
8242 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8243 <span class="special">{</span>
8244 <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">);</span>
8245 <span class="special">}</span>
8247 <div class="variablelist">
8248 <p class="title"><b></b></p>
8249 <dl class="variablelist">
8250 <dt><span class="term">Requires:</span></dt>
8252 <code class="computeroutput"><span class="identifier">lk</span></code> is locked by the
8253 calling thread and either no other thread is waiting on <code class="computeroutput"><span class="identifier">cond</span></code>, or <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span></code> returns the same value for each
8254 of the lock arguments supplied by all concurrently waiting (via
8255 <code class="computeroutput"><span class="identifier">wait</span></code>, <code class="computeroutput"><span class="identifier">wait_for</span></code>, or <code class="computeroutput"><span class="identifier">wait_until</span></code>)
8258 <dt><span class="term">Effects:</span></dt>
8261 transfers ownership of the lock associated with <code class="computeroutput"><span class="identifier">lk</span></code>
8262 into internal storage and schedules <code class="computeroutput"><span class="identifier">cond</span></code>
8263 to be notified when the current thread exits, after all objects of
8264 thread storage duration associated with the current thread have been
8265 destroyed. This notification shall be as if
8269 <pre class="programlisting"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
8270 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_all</span><span class="special">();</span>
8279 <div class="section">
8280 <div class="titlepage"><div><div><h3 class="title">
8281 <a name="thread.synchronization.once"></a><a class="link" href="synchronization.html#thread.synchronization.once" title="One-time Initialization">One-time Initialization</a>
8282 </h3></div></div></div>
8283 <div class="toc"><dl class="toc">
8284 <dt><span class="section"><a href="synchronization.html#thread.synchronization.once.once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a></span></dt>
8285 <dt><span class="section"><a href="synchronization.html#thread.synchronization.once.call_once">Non-member function
8286 <code class="computeroutput"><span class="identifier">call_once</span></code></a></span></dt>
8288 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
8290 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8291 <span class="special">{</span>
8292 <span class="keyword">struct</span> <span class="identifier">once_flag</span><span class="special">;</span>
8293 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">ArgTypes</span><span class="special">></span>
8294 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
8296 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
8297 <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">);</span>
8298 <span class="preprocessor">#endif</span>
8300 <span class="special">}</span>
8302 <div class="warning"><table border="0" summary="Warning">
8304 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8305 <th align="left">Warning</th>
8307 <tr><td align="left" valign="top"><p>
8308 the variadic prototype is provided only on C++11 compilers supporting variadic
8309 templates, otherwise the interface is limited up to 3 parameters.
8312 <div class="warning"><table border="0" summary="Warning">
8314 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8315 <th align="left">Warning</th>
8317 <tr><td align="left" valign="top"><p>
8318 the move semantics is ensured only on C++11 compilers supporting SFINAE
8319 expression, decltype N3276 and auto. Waiting for a boost::bind that is
8324 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code> provides a mechanism for ensuring
8325 that an initialization routine is run exactly once without data races or
8328 <div class="section">
8329 <div class="titlepage"><div><div><h4 class="title">
8330 <a name="thread.synchronization.once.once_flag"></a><a class="link" href="synchronization.html#thread.synchronization.once.once_flag" title="Typedef once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a>
8331 </h4></div></div></div>
8332 <pre class="programlisting"><span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_ONCE_CXX11</span>
8333 <span class="keyword">struct</span> <span class="identifier">once_flag</span>
8334 <span class="special">{</span>
8335 <span class="identifier">constexprr</span> <span class="identifier">once_flag</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
8336 <span class="identifier">once_flag</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8337 <span class="identifier">once_flag</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8338 <span class="special">};</span>
8339 <span class="preprocessor">#else</span>
8340 <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">once_flag</span><span class="special">;</span>
8341 <span class="preprocessor">#define</span> <span class="identifier">BOOST_ONCE_INIT</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">initializer</span>
8342 <span class="preprocessor">#endif</span>
8345 Objects of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span></code> shall be initialized with
8346 <code class="computeroutput"><span class="identifier">BOOST_ONCE_INIT</span></code> if BOOST_THREAD_PROVIDES_ONCE_CXX11
8349 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span> <span class="identifier">f</span><span class="special">=</span><span class="identifier">BOOST_ONCE_INIT</span><span class="special">;</span>
8352 <div class="section">
8353 <div class="titlepage"><div><div><h4 class="title">
8354 <a name="thread.synchronization.once.call_once"></a><a class="link" href="synchronization.html#thread.synchronization.once.call_once" title="Non-member function call_once">Non-member function
8355 <code class="computeroutput"><span class="identifier">call_once</span></code></a>
8356 </h4></div></div></div>
8357 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">ArgTypes</span><span class="special">></span>
8358 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
8360 <div class="variablelist">
8361 <p class="title"><b></b></p>
8362 <dl class="variablelist">
8363 <dt><span class="term">Requires:</span></dt>
8365 <code class="computeroutput"><span class="identifier">Function</span></code> and each
8366 or the <code class="computeroutput"><span class="identifier">ArgTypes</span></code> are
8367 <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
8368 and <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span>
8369 <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8370 shall be well formed.
8372 <dt><span class="term">Effects:</span></dt>
8374 Calls to <code class="computeroutput"><span class="identifier">call_once</span></code>
8375 on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8376 object are serialized. If there has been no prior effective <code class="computeroutput"><span class="identifier">call_once</span></code> on the same <code class="computeroutput"><span class="identifier">once_flag</span></code> object, the argument
8377 <code class="computeroutput"><span class="identifier">func</span></code> is called as-if
8378 by invoking <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code>, and the invocation of <code class="computeroutput"><span class="identifier">call_once</span></code> is effective if and only
8379 if <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span>
8380 <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8381 returns without exception. If an exception is thrown, the exception
8382 is propagated to the caller. If there has been a prior effective
8383 <code class="computeroutput"><span class="identifier">call_once</span></code> on the
8384 same <code class="computeroutput"><span class="identifier">once_flag</span></code> object,
8385 the <code class="computeroutput"><span class="identifier">call_once</span></code> returns
8386 without invoking <code class="computeroutput"><span class="identifier">func</span></code>.
8388 <dt><span class="term">Synchronization:</span></dt>
8390 The completion of an effective <code class="computeroutput"><span class="identifier">call_once</span></code>
8391 invocation on a <code class="computeroutput"><span class="identifier">once_flag</span></code>
8392 object, synchronizes with all subsequent <code class="computeroutput"><span class="identifier">call_once</span></code>
8393 invocations on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8396 <dt><span class="term">Throws:</span></dt>
8398 <code class="computeroutput"><span class="identifier">thread_resource_error</span></code>
8399 when the effects cannot be achieved or any exception propagated from
8400 <code class="computeroutput"><span class="identifier">func</span></code>.
8402 <dt><span class="term">Note:</span></dt>
8404 The function passed to <code class="computeroutput"><span class="identifier">call_once</span></code>
8405 must not also call <code class="computeroutput"><span class="identifier">call_once</span></code>
8406 passing the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8407 object. This may cause deadlock, or invoking the passed function
8408 a second time. The alternative is to allow the second call to return
8409 immediately, but that assumes the code knows it has been called recursively,
8410 and can proceed even though the call to <code class="computeroutput"><span class="identifier">call_once</span></code>
8411 didn't actually call the function, in which case it could also avoid
8412 calling <code class="computeroutput"><span class="identifier">call_once</span></code>
8415 <dt><span class="term">Note:</span></dt>
8417 On some compilers this function has some restrictions, e.g. if variadic
8418 templates are not supported the number of arguments is limited to
8423 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">);</span>
8426 This second overload is provided for backwards compatibility and is deprecated.
8427 The effects of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span><span class="identifier">flag</span><span class="special">)</span></code> shall be the same as those of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">flag</span><span class="special">,</span><span class="identifier">func</span><span class="special">)</span></code>.
8431 <div class="section">
8432 <div class="titlepage"><div><div><h3 class="title">
8433 <a name="thread.synchronization.barriers"></a><a class="link" href="synchronization.html#thread.synchronization.barriers" title="Barriers -- EXTENSION">Barriers -- EXTENSION</a>
8434 </h3></div></div></div>
8435 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a></span></dt></dl></div>
8437 A barrier is a simple concept. Also known as a <span class="emphasis"><em>rendezvous</em></span>,
8438 it is a synchronization point between multiple threads. The barrier is configured
8439 for a particular number of threads (<code class="computeroutput"><span class="identifier">n</span></code>),
8440 and as threads reach the barrier they must wait until all <code class="computeroutput"><span class="identifier">n</span></code>
8441 threads have arrived. Once the <code class="computeroutput"><span class="identifier">n</span></code>-th
8442 thread has reached the barrier, all the waiting threads can proceed, and
8443 the barrier is reset.
8445 <div class="section">
8446 <div class="titlepage"><div><div><h4 class="title">
8447 <a name="thread.synchronization.barriers.barrier"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a>
8448 </h4></div></div></div>
8449 <div class="toc"><dl class="toc">
8450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__">Constructor
8451 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a></span></dt>
8452 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____">Constructor
8453 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&)</span></code></a></span></dt>
8454 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___">Destructor
8455 <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a></span></dt>
8456 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___">Member
8457 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8458 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___">Member
8459 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8461 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">barrier</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
8463 <span class="keyword">class</span> <span class="identifier">barrier</span>
8464 <span class="special">{</span>
8465 <span class="keyword">public</span><span class="special">:</span>
8466 <span class="identifier">barrier</span><span class="special">(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8467 <span class="identifier">barrier</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8469 <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span>
8470 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
8471 <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&);</span>
8473 <span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8475 <span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8476 <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8477 <span class="special">};</span>
8480 Instances of <a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">barrier</span></code></a> are not copyable or movable.
8482 <div class="section">
8483 <div class="titlepage"><div><div><h5 class="title">
8484 <a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__" title="Constructor barrier(unsigned int)">Constructor
8485 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a>
8486 </h5></div></div></div>
8487 <pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span>
8489 <div class="variablelist">
8490 <p class="title"><b></b></p>
8491 <dl class="variablelist">
8492 <dt><span class="term">Effects:</span></dt>
8494 Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8497 <dt><span class="term">Throws:</span></dt>
8499 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8505 <div class="section">
8506 <div class="titlepage"><div><div><h5 class="title">
8507 <a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____" title="Constructor barrier(unsigned int, F&&)">Constructor
8508 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&)</span></code></a>
8509 </h5></div></div></div>
8510 <pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">completion</span><span class="special">);</span>
8512 <div class="variablelist">
8513 <p class="title"><b></b></p>
8514 <dl class="variablelist">
8515 <dt><span class="term">Requires:</span></dt>
8517 The result type of the completion function call <code class="computeroutput"><span class="identifier">completion</span><span class="special">()</span></code> is <code class="computeroutput"><span class="keyword">void</span></code>
8518 or <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">int</span></code>.
8520 <dt><span class="term">Effects:</span></dt>
8522 Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8523 threads and a completion function <code class="computeroutput"><span class="identifier">completion</span></code>.
8525 <dt><span class="term">Throws:</span></dt>
8527 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8533 <div class="section">
8534 <div class="titlepage"><div><div><h5 class="title">
8535 <a name="thread.synchronization.barriers.barrier.destructor___barrier___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___" title="Destructor ~barrier()">Destructor
8536 <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a>
8537 </h5></div></div></div>
8538 <pre class="programlisting"><span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8540 <div class="variablelist">
8541 <p class="title"><b></b></p>
8542 <dl class="variablelist">
8543 <dt><span class="term">Precondition:</span></dt>
8545 No threads are waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8547 <dt><span class="term">Effects:</span></dt>
8549 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8551 <dt><span class="term">Throws:</span></dt>
8558 <div class="section">
8559 <div class="titlepage"><div><div><h5 class="title">
8560 <a name="thread.synchronization.barriers.barrier.member_function__wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___" title="Member Function wait()">Member
8561 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8562 </h5></div></div></div>
8563 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8565 <div class="variablelist">
8566 <p class="title"><b></b></p>
8567 <dl class="variablelist">
8568 <dt><span class="term">Effects:</span></dt>
8570 Block until <code class="computeroutput"><span class="identifier">count</span></code>
8571 threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8572 or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8573 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8574 When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8575 thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8576 the barrier is reset and all waiting threads are unblocked. The
8577 reset depends on whether the barrier was constructed with a completion
8578 function or not. If there is no completion function or if the completion
8579 function result is void, the reset consists in restoring the original
8580 count. Otherwise the rest consist in assigning the result of the
8581 completion function (which must not be 0).
8583 <dt><span class="term">Returns:</span></dt>
8585 <code class="computeroutput"><span class="keyword">true</span></code> for exactly one
8586 thread from each batch of waiting threads, <code class="computeroutput"><span class="keyword">false</span></code>
8589 <dt><span class="term">Throws:</span></dt>
8592 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8596 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8597 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8598 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8599 with the current thread of execution.
8602 <dt><span class="term">Notes:</span></dt>
8604 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8605 is an <span class="emphasis"><em>interruption point</em></span>.
8610 <div class="section">
8611 <div class="titlepage"><div><div><h5 class="title">
8612 <a name="thread.synchronization.barriers.barrier.member_function__count_down_and_wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___" title="Member Function count_down_and_wait()">Member
8613 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
8614 </h5></div></div></div>
8615 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8617 <div class="variablelist">
8618 <p class="title"><b></b></p>
8619 <dl class="variablelist">
8620 <dt><span class="term">Effects:</span></dt>
8622 Block until <code class="computeroutput"><span class="identifier">count</span></code>
8623 threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8624 or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8625 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8626 When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8627 thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8628 the barrier is reset and all waiting threads are unblocked. The
8629 reset depends on whether the barrier was constructed with a completion
8630 function or not. If there is no completion function or if the completion
8631 function result is void, the reset consists in restoring the original
8632 count. Otherwise the rest consist in assigning the result of the
8633 completion function (which must not be 0).
8635 <dt><span class="term">Throws:</span></dt>
8638 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8642 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8643 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8644 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8645 with the current thread of execution.
8648 <dt><span class="term">Notes:</span></dt>
8650 <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
8658 <div class="section">
8659 <div class="titlepage"><div><div><h3 class="title">
8660 <a name="thread.synchronization.latches"></a><a class="link" href="synchronization.html#thread.synchronization.latches" title="Latches -- EXPERIMENTAL">Latches -- EXPERIMENTAL</a>
8661 </h3></div></div></div>
8662 <div class="toc"><dl class="toc">
8663 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.introdcution">Introdcution</a></span></dt>
8664 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.examples">Examples</a></span></dt>
8665 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a></span></dt>
8667 <div class="section">
8668 <div class="titlepage"><div><div><h4 class="title">
8669 <a name="thread.synchronization.latches.introdcution"></a><a class="link" href="synchronization.html#thread.synchronization.latches.introdcution" title="Introdcution">Introdcution</a>
8670 </h4></div></div></div>
8672 Latches are a thread co-ordination mechanism that allow one or more threads
8673 to block until one or more threads have reached a point.
8676 <div class="section">
8677 <div class="titlepage"><div><div><h4 class="title">
8678 <a name="thread.synchronization.latches.examples"></a><a class="link" href="synchronization.html#thread.synchronization.latches.examples" title="Examples">Examples</a>
8679 </h4></div></div></div>
8681 Sample use cases for the latch include:
8683 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
8684 <li class="listitem">
8685 Setting multiple threads to perform a task, and then waiting until
8686 all threads have reached a common point.
8688 <li class="listitem">
8689 Creating multiple threads, which wait for a signal before advancing
8690 beyond a common point.
8694 An example of the first use case would be as follows:
8696 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">(</span><span class="identifier">thread_pool</span><span class="special">*</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
8697 <span class="identifier">latch</span> <span class="identifier">completion_latch</span><span class="special">(</span><span class="identifier">NTASKS</span><span class="special">);</span>
8698 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NTASKS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
8699 <span class="identifier">pool</span><span class="special">-></span><span class="identifier">submit</span><span class="special">([&]</span> <span class="special">{</span>
8700 <span class="comment">// perform work</span>
8701 <span class="special">...</span>
8702 <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8703 <span class="special">}));</span>
8704 <span class="special">}</span>
8705 <span class="comment">// Block until work is done</span>
8706 <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8707 <span class="special">}</span>
8710 An example of the second use case is shown below. We need to load data
8711 and then process it using a number of threads. Loading the data is I/O
8712 bound, whereas starting threads and creating data structures is CPU bound.
8713 By running these in parallel, throughput can be increased.
8715 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">()</span> <span class="special">{</span>
8716 <span class="identifier">latch</span> <span class="identifier">start_latch</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
8717 <span class="identifier">vector</span><span class="special"><</span><span class="identifier">thread</span><span class="special">*></span> <span class="identifier">workers</span><span class="special">;</span>
8718 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NTHREADS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
8719 <span class="identifier">workers</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">thread</span><span class="special">([&]</span> <span class="special">{</span>
8720 <span class="comment">// Initialize data structures. This is CPU bound.</span>
8721 <span class="special">...</span>
8722 <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8723 <span class="comment">// perform work</span>
8724 <span class="special">...</span>
8725 <span class="special">}));</span>
8726 <span class="special">}</span>
8727 <span class="comment">// Load input data. This is I/O bound.</span>
8728 <span class="special">...</span>
8729 <span class="comment">// Threads can now start processing</span>
8730 <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8731 <span class="special">}</span>
8734 <div class="section">
8735 <div class="titlepage"><div><div><h4 class="title">
8736 <a name="thread.synchronization.latches.latch"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a>
8737 </h4></div></div></div>
8738 <div class="toc"><dl class="toc">
8739 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__">Constructor
8740 <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a></span></dt>
8741 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___">Destructor
8742 <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a></span></dt>
8743 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait">Member
8744 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8745 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.try_wait">Member
8746 Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a></span></dt>
8747 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_for">Member
8748 Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8749 </code></a></span></dt>
8750 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_until">Member
8751 Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a></span></dt>
8752 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down">Member
8753 Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a></span></dt>
8754 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait">Member
8755 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8756 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.reset">Member
8757 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a></span></dt>
8759 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">latch</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
8761 <span class="keyword">class</span> <span class="identifier">latch</span>
8762 <span class="special">{</span>
8763 <span class="keyword">public</span><span class="special">:</span>
8764 <span class="identifier">latch</span><span class="special">(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8765 <span class="identifier">latch</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8767 <span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span>
8768 <span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8770 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8771 <span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8772 <span class="keyword">template</span> <span class="special"><</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>
8773 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
8774 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
8775 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
8776 <span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8777 <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8779 <span class="special">};</span>
8782 A latch maintains an internal counter that is initialized when the latch
8783 is created. One or more threads may block waiting until the counter is
8787 Instances of <a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch"><code class="computeroutput"><span class="identifier">latch</span></code></a> are not copyable or movable.
8789 <div class="section">
8790 <div class="titlepage"><div><div><h5 class="title">
8791 <a name="thread.synchronization.latches.latch.constructor__latch_std__size_t__"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__" title="Constructor latch(std::size_t)">Constructor
8792 <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a>
8793 </h5></div></div></div>
8794 <pre class="programlisting"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span>
8796 <div class="variablelist">
8797 <p class="title"><b></b></p>
8798 <dl class="variablelist">
8799 <dt><span class="term">Effects:</span></dt>
8801 Construct a latch with is initial value for the internal counter.
8803 <dt><span class="term">Note:</span></dt>
8805 The counter could be zero.
8807 <dt><span class="term">Throws:</span></dt>
8814 <div class="section">
8815 <div class="titlepage"><div><div><h5 class="title">
8816 <a name="thread.synchronization.latches.latch.destructor___latch___"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___" title="Destructor ~latch()">Destructor
8817 <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a>
8818 </h5></div></div></div>
8819 <pre class="programlisting"><span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8821 <div class="variablelist">
8822 <p class="title"><b></b></p>
8823 <dl class="variablelist">
8824 <dt><span class="term">Precondition:</span></dt>
8826 No threads are waiting or invoking count_down on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8828 <dt><span class="term">Effects:</span></dt>
8830 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
8833 <dt><span class="term">Throws:</span></dt>
8840 <div class="section">
8841 <div class="titlepage"><div><div><h5 class="title">
8842 <a name="thread.synchronization.latches.latch.wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait" title="Member Function wait()">Member
8843 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8844 </h5></div></div></div>
8845 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8847 <div class="variablelist">
8848 <p class="title"><b></b></p>
8849 <dl class="variablelist">
8850 <dt><span class="term">Effects:</span></dt>
8852 Block the calling thread until the internal count reaches the value
8853 zero. Then all waiting threads are unblocked.
8855 <dt><span class="term">Throws:</span></dt>
8858 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8862 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8863 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8864 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8865 with the current thread of execution.
8868 <dt><span class="term">Notes:</span></dt>
8870 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8871 is an <span class="emphasis"><em>interruption point</em></span>.
8876 <div class="section">
8877 <div class="titlepage"><div><div><h5 class="title">
8878 <a name="thread.synchronization.latches.latch.try_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.try_wait" title="Member Function try_wait()">Member
8879 Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a>
8880 </h5></div></div></div>
8881 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8883 <div class="variablelist">
8884 <p class="title"><b></b></p>
8885 <dl class="variablelist">
8886 <dt><span class="term">Returns:</span></dt>
8888 Returns true if the internal count is 0, and false otherwise. Does
8889 not block the calling thread.
8891 <dt><span class="term">Throws:</span></dt>
8893 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8899 <div class="section">
8900 <div class="titlepage"><div><div><h5 class="title">
8901 <a name="thread.synchronization.latches.latch.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_for" title="Member Function wait_for()">Member
8902 Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8904 </h5></div></div></div>
8905 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span>
8906 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span>
8908 <div class="variablelist">
8909 <p class="title"><b></b></p>
8910 <dl class="variablelist">
8911 <dt><span class="term">Effects:</span></dt>
8913 Block the calling thread until the internal count reaches the value
8914 zero or the duration has been elapsed. If no timeout, all waiting
8915 threads are unblocked.
8917 <dt><span class="term">Returns:</span></dt>
8919 cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8920 if duration has been elapsed.
8922 <dt><span class="term">Throws:</span></dt>
8925 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8929 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8930 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8931 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8932 with the current thread of execution.
8935 <dt><span class="term">Notes:</span></dt>
8937 <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
8938 is an <span class="emphasis"><em>interruption point</em></span>.
8943 <div class="section">
8944 <div class="titlepage"><div><div><h5 class="title">
8945 <a name="thread.synchronization.latches.latch.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_until" title="Member Function wait_until()">Member
8946 Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
8947 </h5></div></div></div>
8948 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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>
8949 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span>
8951 <div class="variablelist">
8952 <p class="title"><b></b></p>
8953 <dl class="variablelist">
8954 <dt><span class="term">Effects:</span></dt>
8956 Block the calling thread until the internal count reaches the value
8957 zero or the time_point has been reached. If no timeout, all waiting
8958 threads are unblocked.
8960 <dt><span class="term">Returns:</span></dt>
8962 cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8963 if time_point has been reached.
8965 <dt><span class="term">Throws:</span></dt>
8968 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8972 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8973 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8974 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8975 with the current thread of execution.
8978 <dt><span class="term">Notes:</span></dt>
8980 <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
8981 is an <span class="emphasis"><em>interruption point</em></span>.
8986 <div class="section">
8987 <div class="titlepage"><div><div><h5 class="title">
8988 <a name="thread.synchronization.latches.latch.count_down"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down" title="Member Function count_down()">Member
8989 Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a>
8990 </h5></div></div></div>
8991 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8993 <div class="variablelist">
8994 <p class="title"><b></b></p>
8995 <dl class="variablelist">
8996 <dt><span class="term">Requires:</span></dt>
8998 The internal counter is non zero.
9000 <dt><span class="term">Effects:</span></dt>
9002 Decrements the internal count by 1, and returns. If the count reaches
9003 0, any threads blocked in wait() will be released.
9005 <dt><span class="term">Throws:</span></dt>
9008 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9012 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9013 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
9014 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
9015 with the current thread of execution.
9018 <dt><span class="term">Notes:</span></dt>
9020 <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code>
9021 is an <span class="emphasis"><em>interruption point</em></span>.
9026 <div class="section">
9027 <div class="titlepage"><div><div><h5 class="title">
9028 <a name="thread.synchronization.latches.latch.count_down_and_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait" title="Member Function count_down_and_wait()">Member
9029 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
9030 </h5></div></div></div>
9031 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
9033 <div class="variablelist">
9034 <p class="title"><b></b></p>
9035 <dl class="variablelist">
9036 <dt><span class="term">Requires:</span></dt>
9038 The internal counter is non zero.
9040 <dt><span class="term">Effects:</span></dt>
9042 Decrements the internal count by 1. If the resulting count is not
9043 0, blocks the calling thread until the internal count is decremented
9044 to 0 by one or more other threads calling count_down() or count_down_and_wait().
9046 <dt><span class="term">Throws:</span></dt>
9049 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9053 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9054 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
9055 on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
9056 with the current thread of execution.
9059 <dt><span class="term">Notes:</span></dt>
9061 <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
9070 <div class="section">
9071 <div class="titlepage"><div><div><h5 class="title">
9072 <a name="thread.synchronization.latches.latch.reset"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.reset" title="Member Function reset()">Member
9073 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
9074 </h5></div></div></div>
9075 <pre class="programlisting"><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">size_t</span> <span class="special">);</span>
9077 <div class="variablelist">
9078 <p class="title"><b></b></p>
9079 <dl class="variablelist">
9080 <dt><span class="term">Requires:</span></dt>
9082 This function may only be invoked when there are no other threads
9083 currently inside the waiting functions.
9085 <dt><span class="term">Returns:</span></dt>
9087 Resets the latch with a new value for the initial thread count.
9089 <dt><span class="term">Throws:</span></dt>
9091 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9102 <div class="section">
9103 <div class="titlepage"><div><div><h3 class="title">
9104 <a name="thread.synchronization.executors"></a><a class="link" href="synchronization.html#thread.synchronization.executors" title="Executors and Schedulers -- EXPERIMENTAL">Executors and Schedulers
9106 </h3></div></div></div>
9107 <div class="toc"><dl class="toc">
9108 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.introduction">Introduction</a></span></dt>
9109 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples">Examples</a></span></dt>
9110 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.rationale">Design
9111 Rationale</a></span></dt>
9112 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref">Reference</a></span></dt>
9114 <div class="warning"><table border="0" summary="Warning">
9116 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
9117 <th align="left">Warning</th>
9119 <tr><td align="left" valign="top"><p>
9120 These features are experimental and subject to change in future versions.
9121 There are not too much tests yet, so it is possible that you can find out
9122 some trivial bugs :(
9125 <div class="note"><table border="0" summary="Note">
9127 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
9128 <th align="left">Note</th>
9130 <tr><td align="left" valign="top"><p>
9131 These features are based on the <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3785.pdf" target="_top"><span class="bold"><strong>N3785 - Executors and Schedulers revision 3</strong></span></a>
9132 C++1y proposal from Chris Mysen, Niklas Gustafsson, Matt Austern, Jeffrey
9133 Yasskin. The text that follows has been adapted from tis paper to show
9138 Executors are objects that can execute units of work packaged as function
9139 objects. Boost.Thread differs from N3785 mainly in the an Executor doesn't
9140 needs to inherit from an abstract class Executor. Static polymorphism is
9141 used instead and type erasure is used internally.
9143 <div class="section">
9144 <div class="titlepage"><div><div><h4 class="title">
9145 <a name="thread.synchronization.executors.introduction"></a><a class="link" href="synchronization.html#thread.synchronization.executors.introduction" title="Introduction">Introduction</a>
9146 </h4></div></div></div>
9148 Multithreaded programs often involve discrete (sometimes small) units of
9149 work that are executed asynchronously. This often involves passing work
9150 units to some component that manages execution. We already have boost::async,
9151 which potentially executes a function asynchronously and eventually returns
9152 its result in a future. (“As if” by launching a new thread.)
9155 If there is a regular stream of small work items then we almost certainly
9156 don’t want to launch a new thread for each, and it’s likely that we
9157 want at least some control over which thread(s) execute which items. It
9158 is often convenient to represent that control as multiple executor objects.
9159 This allows programs to start executors when necessary, switch from one
9160 executor to another to control execution policy, and use multiple executors
9161 to prevent interference and thread exhaustion. Several possible implementations
9162 exist of the executor class and in practice there are a number of main
9163 groups of executors which have been found to be useful in real-world code
9164 (more implementations exist, this is simply a high level classification
9165 of them). These differ along a couple main dimensions, how many execution
9166 contexts will be used, how they are selected, and how they are prioritized.
9168 <div class="orderedlist"><ol class="orderedlist" type="1">
9169 <li class="listitem">
9171 <div class="orderedlist"><ol class="orderedlist" type="a">
9172 <li class="listitem">
9173 Simple unbounded thread pool, which can queue up an unbounded
9174 amount of work and maintains a dedicated set of threads (up to
9175 some maximum) which dequeue and execute work as available.
9177 <li class="listitem">
9178 Bounded thread pools, which can be implemented as a specialization
9179 of the previous ones with a bounded queue or semaphore, which
9180 limits the amount of queuing in an attempt to bound the time
9181 spent waiting to execute and/or limit resource utilization for
9182 work tasks which hold state which is expensive to hold.
9184 <li class="listitem">
9185 Thread-spawning executors, in which each work always executes
9188 <li class="listitem">
9189 Prioritized thread pools, which have works which are not equally
9190 prioritized such that work can move to the front of the execution
9191 queue if necessary. This requires a special comparator or prioritization
9192 function to allow for work ordering and normally is implemented
9193 as a blocking priority queue in front of the pool instead of
9194 a blocking queue. This has many uses but is a somewhat specialized
9195 in nature and would unnecessarily clutter the initial interface.
9197 <li class="listitem">
9198 Work stealing thread pools, this is a specialized use case and
9199 is encapsulated in the ForkJoinPool in java, which allows lightweight
9200 work to be created by tasks in the pool and either run by the
9201 same thread for invocation efficiency or stolen by another thread
9202 without additional work. These have been left out until there
9203 is a more concrete fork-join proposal or until there is a more
9204 clear need as these can be complicated to implement
9208 <li class="listitem">
9209 Mutual exclusion executors
9210 <div class="orderedlist"><ol class="orderedlist" type="a">
9211 <li class="listitem">
9212 Serial executors, which guarantee all work to be executed such
9213 that no two works will execute concurrently. This allows for
9214 a sequence of operations to be queued in sequence and that sequential
9215 order is maintained and work can be queued on a separate thread
9216 but with no mutual exclusion required.
9218 <li class="listitem">
9219 Loop executor, in which one thread donates itself to the executor
9220 to execute all queued work. This is related to the serial executor
9221 in that it guarantees mutual exclusion, but instead guarantees
9222 a particular thread will execute the work. These are particularly
9223 useful for testing purposes where code assumes an executor but
9224 testing code desires control over execution.
9226 <li class="listitem">
9227 GUI thread executor, where a GUI framework can expose an executor
9228 interface to allow other threads to queue up work to be executed
9229 as part of the GUI thread. This behaves similarly to a loop executor,
9230 but must be implemented as a custom interface as part of the
9235 <li class="listitem">
9236 Inline executors, which execute inline to the thread which calls submit().
9237 This has no queuing and behaves like a normal executor, but always
9238 uses the caller’s thread to execute. This allows parallel execution
9239 of works, though. This type of executor is often useful when there
9240 is an executor required by an interface, but when for performance reasons
9241 it’s better not to queue work or switch threads. This is often very
9242 useful as an optimization for work continuations which should execute
9243 immediately or quickly and can also be useful for optimizations when
9244 an interface requires an executor but the work tasks are too small
9245 to justify the overhead of a full thread pool.
9249 A question arises of which of these executors (or others) be included in
9250 this library. There are use cases for these and many other executors. Often
9251 it is useful to have more than one implemented executor (e.g. the thread
9252 pool) to have more precise control of where the work is executed due to
9253 the existence of a GUI thread, or for testing purposes. A few core executors
9254 are frequently useful and these have been outlined here as the core of
9255 what should be in this library, if common use cases arise for alternative
9256 executor implementations, they can be added in the future. The current
9257 set provided here are: a basic thread pool <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code>,
9258 a serial executor <code class="computeroutput"><span class="identifier">serial_executor</span></code>,
9259 a loop executor <code class="computeroutput"><span class="identifier">loop_executor</span></code>,
9260 an inline executor <code class="computeroutput"><span class="identifier">inline_executor</span></code>
9261 and a thread-spawning executor <code class="computeroutput"><span class="identifier">thread_executor</span></code>.
9264 <div class="section">
9265 <div class="titlepage"><div><div><h4 class="title">
9266 <a name="thread.synchronization.executors.examples"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples" title="Examples">Examples</a>
9267 </h4></div></div></div>
9268 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples.quick_sort">Parallel
9269 Quick Sort</a></span></dt></dl></div>
9270 <div class="section">
9271 <div class="titlepage"><div><div><h5 class="title">
9272 <a name="thread.synchronization.executors.examples.quick_sort"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples.quick_sort" title="Parallel Quick Sort">Parallel
9274 </h5></div></div></div>
9275 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">executors</span><span class="special">/</span><span class="identifier">basic_thread_pool</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
9276 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">future</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
9277 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">numeric</span><span class="special">></span>
9278 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
9279 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">functional</span><span class="special">></span>
9280 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
9281 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span>
9283 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
9284 <span class="keyword">struct</span> <span class="identifier">sorter</span>
9285 <span class="special">{</span>
9286 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">;</span>
9287 <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">return_type</span><span class="special">;</span>
9289 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">chunk_data</span><span class="special">)</span>
9290 <span class="special">{</span>
9291 <span class="keyword">if</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
9292 <span class="keyword">return</span> <span class="identifier">chunk_data</span><span class="special">;</span>
9293 <span class="special">}</span>
9295 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">result</span><span class="special">;</span>
9296 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">chunk_data</span><span class="special">,</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
9297 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</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 <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">divide_point</span> <span class="special">=</span>
9300 <span class="identifier">std</span><span class="special">::</span><span class="identifier">partition</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
9301 <span class="special">[&](</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">){</span><span class="keyword">return</span> <span class="identifier">val</span><span class="special"><</span><span class="identifier">partition_val</span><span class="special">;});</span>
9303 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">new_lower_chunk</span><span class="special">;</span>
9304 <span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">,</span>
9305 <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">divide_point</span><span class="special">);</span>
9306 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">new_lower</span> <span class="special">=</span>
9307 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">pool</span><span class="special">,</span> <span class="special">&</span><span class="identifier">sorter</span><span class="special">::</span><span class="identifier">do_sort</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">new_lower_chunk</span><span class="special">));</span>
9308 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">new_higher</span><span class="special">(</span><span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">));</span>
9309 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">new_higher</span><span class="special">);</span>
9310 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">())</span> <span class="special">{</span>
9311 <span class="identifier">pool</span><span class="special">.</span><span class="identifier">schedule_one_or_yield</span><span class="special">();</span>
9312 <span class="special">}</span>
9313 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">get</span><span class="special">());</span>
9314 <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
9315 <span class="special">}</span>
9316 <span class="special">};</span>
9318 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
9319 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">parallel_quick_sort</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">input</span><span class="special">)</span> <span class="special">{</span>
9320 <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
9321 <span class="keyword">return</span> <span class="identifier">input</span><span class="special">;</span>
9322 <span class="special">}</span>
9323 <span class="identifier">sorter</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">s</span><span class="special">;</span>
9324 <span class="keyword">return</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">input</span><span class="special">);</span>
9325 <span class="special">}</span>
9329 <div class="section">
9330 <div class="titlepage"><div><div><h4 class="title">
9331 <a name="thread.synchronization.executors.rationale"></a><a class="link" href="synchronization.html#thread.synchronization.executors.rationale" title="Design Rationale">Design
9333 </h4></div></div></div>
9335 The authors of Boost.Thread have taken a different approach respect to
9336 N3785. Instead of basing all the design on a abstract executor class we
9337 make executor concepts. We believe that this is the good direction as a
9338 static polymorphic executor can be seen as a dynamic polymorphic executor
9339 using a simple adaptor. We believe also that it would make the library
9340 more usable, and more convenient for users.
9343 The major design decisions concern deciding what a unit of work is, how
9344 to manage with units of work and time related functions in a polymorphic
9348 An Executor is an object that schedules the closures that have been submitted
9349 to it, usually asynchronously. There could be multiple models of the Executor
9350 class. Some specific design notes:
9352 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9353 <li class="listitem">
9354 Thread pools are well know models of the Executor concept, and this
9355 library does indeed include a basic_thread_pool class, but other implementations
9356 also exist, including the ability to schedule work on GUI threads,
9357 scheduling work on a donor thread, as well as several specializations
9360 <li class="listitem">
9361 The choice of which executor to use is explicit. This is important
9362 for reasons described in the Motivation section. In particular, consider
9363 the common case of an asynchronous operation that itself spawns asynchronous
9364 operations. If both operations ran on the same executor, and if that
9365 executor had a bounded number of worker threads, then we could get
9366 deadlock. Programs often deal with such issues by splitting different
9367 kinds of work between different executors.
9369 <li class="listitem">
9370 Even if there could be a strong value in having a default executor,
9371 that can be used when detailed control is unnecessary, the authors
9372 don't know how to implement it in a portable and robust way.
9374 <li class="listitem">
9375 The library provides Executors based on static and dynamic polymorphism.
9376 The static polymorphism interface is intended to be used on contexts
9377 that need to have the best performances. The dynamic polymorphism interface
9378 has the advantage to been able to change the executor a function is
9379 using without making it a template and is possible to pass executors
9380 across a binary interface. For some applications, the cost of an additional
9381 virtual dispatch could be almost certainly negligible compared to the
9382 other operations involved.
9384 <li class="listitem">
9385 Conceptually, an executor puts closures on a queue and at some point
9386 executes them. The queue is always unbounded, so adding a closure to
9387 an executor never blocks. (Defining “never blocks” formally is
9388 challenging, but informally we just mean that submit() is an ordinary
9389 function that executes something and returns, rather than waiting for
9390 the completion of some potentially long running operation in another
9395 <a name="thread.synchronization.executors.rationale.h0"></a>
9396 <span class="phrase"><a name="thread.synchronization.executors.rationale.closure"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.closure">Closure</a>
9399 One important question is just what a closure is. This library has a very
9400 simple answer: a closure is a <code class="computeroutput"><span class="identifier">Callable</span></code>
9401 with no parameters and returning <code class="computeroutput"><span class="keyword">void</span></code>.
9404 N3785 choose the more specific <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code> as it provides only dynamic polymorphism
9405 and states that in practice the implementation of a template based approach
9406 or another approach is impractical. The authors of this library think that
9407 the template based approach is compatible with a dynamic based approach.
9408 They give some arguments:
9411 The first one is that a virtual function can not be a template. This is
9412 true but it is also true that the executor interface can provide the template
9413 functions that call to the virtual public functions. Another reason they
9414 give is that "a template parameter would complicate the interface
9415 without adding any real generality. In the end an executor class is going
9416 to need some kind of type erasure to handle all the different kinds of
9417 function objects with <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> signature, and that’s exactly what
9418 std::function already does". We think that it is up to the executor
9419 to manage with this implementation details, not to the user.
9422 We share all the argument they give related to the <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> interface of the work unit. A work unit
9423 is a closure that takes no arguments and returns no value. This is indeed
9424 a limitation on user code, but combined with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
9425 taking executors as parameters the user has all what she needs.
9428 The third one is related to performance. They assert that "any mechanism
9429 for storing closures on an executor’s queue will have to use some form
9430 of type erasure. There’s no reason to believe that a custom closure mechanism,
9431 written just for std::executor and used nowhere else within the standard
9432 library, would be better in that respect than <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code>". We believe that the implementation
9433 can do better that storing the closure on a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code>. e.g. the implementation can use
9434 intrusive data to store the closure and the pointers to other nodes needed
9435 to store the closures in a given order.
9438 In addition <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code>
9439 can not be constructed by moving the closure, so e.g. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">packaged_task</span></code>
9440 could not be a Closure.
9443 <a name="thread.synchronization.executors.rationale.h1"></a>
9444 <span class="phrase"><a name="thread.synchronization.executors.rationale.not_handled_exceptions"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.not_handled_exceptions">Not
9445 Handled Exceptions</a>
9448 As in N3785 and based on the same design decision than <code class="computeroutput"><span class="identifier">std</span></code>/<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> if a user closure throws an exception,
9449 the executor must call the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
9450 function. Note that when we combine <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
9451 and <code class="computeroutput"><span class="identifier">Executors</span></code>, the exception
9452 will be caught by the closure associated to the returned future, so that
9453 the exception is stored on the returned future, as for the other <code class="computeroutput"><span class="identifier">async</span></code> overloads.
9456 <a name="thread.synchronization.executors.rationale.h2"></a>
9457 <span class="phrase"><a name="thread.synchronization.executors.rationale.at_thread_entry"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.at_thread_entry">At
9461 It is common idiom to set some thread local variable at the beginning of
9462 a thread. As Executors could instantiate threads internally these Executors
9463 shall have the ability to call a user specific function at thread entry
9464 on the executor constructor.
9467 For executors that don't instantiate any thread and that would use the
9468 current thread this function shall be called only for the thread calling
9469 the <code class="computeroutput"><span class="identifier">at_thread_entry</span></code> member
9473 <a name="thread.synchronization.executors.rationale.h3"></a>
9474 <span class="phrase"><a name="thread.synchronization.executors.rationale.cancelation"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.cancelation">Cancelation</a>
9477 The library does not provision yet for the ability to cancel/interrupt
9478 work, though this is a commonly requested feature.
9481 This could be managed externally by an additional cancelation object that
9482 can be shared between the creator of the unit of work and the unit of work.
9485 We can think also of a cancelable closure that could be used in a more
9489 An alternative is to make async return a cancelable_task but this will
9490 need also a cancelable closure.
9493 <a name="thread.synchronization.executors.rationale.h4"></a>
9494 <span class="phrase"><a name="thread.synchronization.executors.rationale.current_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.current_executor">Current
9498 The library does not provision for the ability to get the current executor,
9499 though having access to it could simplify a lot the user code.
9502 The reason is that the user can always use a thread_local variable and
9503 reset it using the <code class="computeroutput"><span class="identifier">at_thread_entry</span>
9504 </code> member function.
9506 <pre class="programlisting"><span class="keyword">thread_local</span> <span class="identifier">current_executor_state_type</span> <span class="identifier">current_executor_state</span><span class="special">;</span>
9507 <span class="identifier">executor</span><span class="special">*</span> <span class="identifier">current_executor</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">current_executor</span><span class="special">();</span> <span class="special">}</span>
9508 <span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span>
9509 <span class="comment">// at_thread_entry</span>
9510 <span class="special">[](</span><span class="identifier">basic_thread_pool</span><span class="special">&</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
9511 <span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">set_current_executor</span><span class="special">(</span><span class="identifier">pool</span><span class="special">);</span>
9512 <span class="special">}</span>
9513 <span class="special">);</span>
9516 <a name="thread.synchronization.executors.rationale.h5"></a>
9517 <span class="phrase"><a name="thread.synchronization.executors.rationale.default_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.default_executor">Default
9521 The library authors share some of the concerns of the C++ standard committee
9522 (introduction of a new single shared resource, a singleton, could make
9523 it difficult to make it portable to all the environments) and that this
9524 library doesn't need to provide a default executor for the time been.
9527 The user can always define his default executor himself and use the <code class="computeroutput"><span class="identifier">at_thread_entry</span> </code> member function to set
9528 the default constructor.
9530 <pre class="programlisting"><span class="keyword">thread_local</span> <span class="identifier">default_executor_state_type</span> <span class="identifier">default_executor_state</span><span class="special">;</span>
9531 <span class="identifier">executor</span><span class="special">*</span> <span class="identifier">default_executor</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">default_executor</span><span class="special">();</span> <span class="special">}</span>
9533 <span class="comment">// in main</span>
9534 <span class="identifier">MyDefaultExecutor</span> <span class="identifier">myDefaultExecutor</span><span class="special">(</span>
9535 <span class="comment">// at_thread_entry</span>
9536 <span class="special">[](</span><span class="identifier">MyDefaultExecutor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">)</span> <span class="special">{</span>
9537 <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">set_default_executor</span><span class="special">(</span><span class="identifier">ex</span><span class="special">);</span>
9538 <span class="special">}</span>
9539 <span class="special">);</span>
9541 <span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span>
9542 <span class="comment">// at_thread_entry</span>
9543 <span class="special">[&</span><span class="identifier">myDefaultExecutor</span><span class="special">](</span><span class="identifier">basic_thread_pool</span><span class="special">&</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
9544 <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">set_default_executor</span><span class="special">(</span><span class="identifier">myDefaultExecutor</span><span class="special">);</span>
9545 <span class="special">}</span>
9546 <span class="special">);</span>
9549 <div class="section">
9550 <div class="titlepage"><div><div><h4 class="title">
9551 <a name="thread.synchronization.executors.ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref" title="Reference">Reference</a>
9552 </h4></div></div></div>
9553 <div class="toc"><dl class="toc">
9554 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_closure">Concept
9555 <code class="computeroutput"><span class="identifier">Closure</span></code></a></span></dt>
9556 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_executor">Concept
9557 <code class="computeroutput"><span class="identifier">Executor</span></code></a></span></dt>
9558 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.work">Class
9559 <code class="computeroutput"><span class="identifier">work</span></code></a></span></dt>
9560 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor">Class
9561 <code class="computeroutput"><span class="identifier">executor</span></code></a></span></dt>
9562 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor">Template
9563 Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a></span></dt>
9564 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref">Class
9565 <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a></span></dt>
9566 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.serial_executor">Class
9567 <code class="computeroutput"><span class="identifier">serial_executor</span></code></a></span></dt>
9568 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.inline_executor">Class
9569 <code class="computeroutput"><span class="identifier">inline_executor</span></code></a></span></dt>
9570 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool">Class
9571 <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a></span></dt>
9572 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.loop_executor">Class
9573 <code class="computeroutput"><span class="identifier">loop_executor</span></code></a></span></dt>
9575 <div class="section">
9576 <div class="titlepage"><div><div><h5 class="title">
9577 <a name="thread.synchronization.executors.ref.concept_closure"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_closure" title="Concept Closure">Concept
9578 <code class="computeroutput"><span class="identifier">Closure</span></code></a>
9579 </h5></div></div></div>
9581 A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Closure</span></code> requirements if is a model
9582 of <code class="computeroutput"><span class="identifier">Callable</span><span class="special">(</span><span class="keyword">void</span><span class="special">())</span></code>
9583 and a model of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>/<code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
9586 <div class="section">
9587 <div class="titlepage"><div><div><h5 class="title">
9588 <a name="thread.synchronization.executors.ref.concept_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor" title="Concept Executor">Concept
9589 <code class="computeroutput"><span class="identifier">Executor</span></code></a>
9590 </h5></div></div></div>
9592 The <code class="computeroutput"><span class="identifier">Executor</span></code> concept
9593 models the common operations of all the executors.
9596 A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Executor</span></code> requirements if the following
9597 expressions are well-formed and have the specified semantics
9599 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9600 <li class="listitem">
9601 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code>
9603 <li class="listitem">
9604 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">rc</span><span class="special">);</span></code>
9606 <li class="listitem">
9607 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code>
9609 <li class="listitem">
9610 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span>
9611 <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code>
9613 <li class="listitem">
9614 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code>
9616 <li class="listitem">
9617 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
9623 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9624 <li class="listitem">
9625 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value
9626 of type <code class="computeroutput"><span class="identifier">E</span></code>,
9628 <li class="listitem">
9629 <code class="computeroutput"><span class="identifier">lc</span></code> denotes a lvalue
9630 referece of type <code class="computeroutput"><span class="identifier">Closure</span></code>,
9632 <li class="listitem">
9633 <code class="computeroutput"><span class="identifier">rc</span></code> denotes a rvalue
9634 referece of type <code class="computeroutput"><span class="identifier">Closure</span></code>
9636 <li class="listitem">
9637 <code class="computeroutput"><span class="identifier">p</span></code> denotes a value
9638 of type <code class="computeroutput"><span class="identifier">Predicate</span></code>
9641 <div class="section">
9642 <div class="titlepage"><div><div><h6 class="title">
9643 <a name="thread.synchronization.executors.ref.concept_executor.submitlc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitlc" title="e.submit(lc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code></a>
9644 </h6></div></div></div>
9645 <div class="variablelist">
9646 <p class="title"><b></b></p>
9647 <dl class="variablelist">
9648 <dt><span class="term">Effects:</span></dt>
9650 The specified closure will be scheduled for execution at some
9651 point in the future. If invoked closure throws an exception the
9652 executor will call std::terminate, as is the case with threads.
9654 <dt><span class="term">Synchronization:</span></dt>
9656 completion of closure on a particular thread happens before destruction
9657 of thread's thread local variables.
9659 <dt><span class="term">Return type:</span></dt>
9661 <code class="computeroutput"><span class="keyword">void</span></code>.
9663 <dt><span class="term">Throws:</span></dt>
9665 sync_queue_is_closed if the thread pool is closed. Whatever exception
9666 that can be throw while storing the closure.
9668 <dt><span class="term">Exception safety:</span></dt>
9670 If an exception is thrown then the executor state is unmodified.
9675 <div class="section">
9676 <div class="titlepage"><div><div><h6 class="title">
9677 <a name="thread.synchronization.executors.ref.concept_executor.submitrc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitrc" title="e.submit(lc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code></a>
9678 </h6></div></div></div>
9679 <div class="variablelist">
9680 <p class="title"><b></b></p>
9681 <dl class="variablelist">
9682 <dt><span class="term">Effects:</span></dt>
9684 The specified closure will be scheduled for execution at some
9685 point in the future. If invoked closure throws an exception the
9686 executor will call std::terminate, as is the case with threads.
9688 <dt><span class="term">Synchronization:</span></dt>
9690 completion of closure on a particular thread happens before destruction
9691 of thread's thread local variables.
9693 <dt><span class="term">Return type:</span></dt>
9695 <code class="computeroutput"><span class="keyword">void</span></code>.
9697 <dt><span class="term">Throws:</span></dt>
9699 sync_queue_is_closed if the thread pool is closed. Whatever exception
9700 that can be throw while storing the closure.
9702 <dt><span class="term">Exception safety:</span></dt>
9704 If an exception is thrown then the executor state is unmodified.
9709 <div class="section">
9710 <div class="titlepage"><div><div><h6 class="title">
9711 <a name="thread.synchronization.executors.ref.concept_executor.close"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.close" title="e.close();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code></a>
9712 </h6></div></div></div>
9713 <div class="variablelist">
9714 <p class="title"><b></b></p>
9715 <dl class="variablelist">
9716 <dt><span class="term">Effects:</span></dt>
9718 close the executor <code class="computeroutput"><span class="identifier">e</span></code>
9721 <dt><span class="term">Remark:</span></dt>
9723 The worker threads will work until there is no more closures
9726 <dt><span class="term">Return type:</span></dt>
9728 <code class="computeroutput"><span class="keyword">void</span></code>.
9730 <dt><span class="term">Throws:</span></dt>
9732 Whatever exception that can be throw while ensuring the thread
9735 <dt><span class="term">Exception safety:</span></dt>
9737 If an exception is thrown then the executor state is unmodified.
9742 <div class="section">
9743 <div class="titlepage"><div><div><h6 class="title">
9744 <a name="thread.synchronization.executors.ref.concept_executor.closed"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.closed" title="b = e.closed();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code></a>
9745 </h6></div></div></div>
9746 <div class="variablelist">
9747 <p class="title"><b></b></p>
9748 <dl class="variablelist">
9749 <dt><span class="term">Return type:</span></dt>
9751 <code class="computeroutput"><span class="keyword">bool</span></code>.
9753 <dt><span class="term">Return:</span></dt>
9755 whether the pool is closed for submissions.
9757 <dt><span class="term">Throws:</span></dt>
9759 Whatever exception that can be throw while ensuring the thread
9765 <div class="section">
9766 <div class="titlepage"><div><div><h6 class="title">
9767 <a name="thread.synchronization.executors.ref.concept_executor.try_executing_one"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.try_executing_one" title="e.try_executing_one();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code></a>
9768 </h6></div></div></div>
9769 <div class="variablelist">
9770 <p class="title"><b></b></p>
9771 <dl class="variablelist">
9772 <dt><span class="term">Effects:</span></dt>
9774 try to execute one work.
9776 <dt><span class="term">Remark:</span></dt>
9778 whether a work has been executed.
9780 <dt><span class="term">Return type:</span></dt>
9782 <code class="computeroutput"><span class="keyword">bool</span></code>.
9784 <dt><span class="term">Return:</span></dt>
9786 Whether a work has been executed.
9788 <dt><span class="term">Throws:</span></dt>
9790 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9796 <div class="section">
9797 <div class="titlepage"><div><div><h6 class="title">
9798 <a name="thread.synchronization.executors.ref.concept_executor.reschedule_until"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.reschedule_until" title="e.reschedule_until(p);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code></a>
9799 </h6></div></div></div>
9800 <div class="variablelist">
9801 <p class="title"><b></b></p>
9802 <dl class="variablelist">
9803 <dt><span class="term">Requires:</span></dt>
9805 This must be called from an scheduled work
9807 <dt><span class="term">Effects:</span></dt>
9809 reschedule works until <code class="computeroutput"><span class="identifier">p</span><span class="special">()</span></code>.
9811 <dt><span class="term">Return type:</span></dt>
9813 <code class="computeroutput"><span class="keyword">bool</span></code>.
9815 <dt><span class="term">Return:</span></dt>
9817 Whether a work has been executed.
9819 <dt><span class="term">Throws:</span></dt>
9821 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9828 <div class="section">
9829 <div class="titlepage"><div><div><h5 class="title">
9830 <a name="thread.synchronization.executors.ref.work"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.work" title="Class work">Class
9831 <code class="computeroutput"><span class="identifier">work</span></code></a>
9832 </h5></div></div></div>
9833 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
9834 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9835 <span class="keyword">typedef</span> <span class="char">'implementation_defined'</span> <span class="identifier">work</span><span class="special">;</span>
9836 <span class="special">}</span>
9838 <div class="variablelist">
9839 <p class="title"><b></b></p>
9840 <dl class="variablelist">
9841 <dt><span class="term">Requires:</span></dt>
9843 work is a model of 'Closure'
9848 <div class="section">
9849 <div class="titlepage"><div><div><h5 class="title">
9850 <a name="thread.synchronization.executors.ref.executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor" title="Class executor">Class
9851 <code class="computeroutput"><span class="identifier">executor</span></code></a>
9852 </h5></div></div></div>
9854 Executor abstract base class.
9856 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
9857 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9858 <span class="keyword">class</span> <span class="identifier">executor</span>
9859 <span class="special">{</span>
9860 <span class="keyword">public</span><span class="special">:</span>
9861 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span>
9863 <span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9864 <span class="identifier">executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9866 <span class="identifier">executor</span><span class="special">();</span>
9867 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">()</span> <span class="special">{};</span>
9869 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9870 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9872 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9873 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9874 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
9875 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
9877 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9878 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
9879 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
9880 <span class="special">};</span>
9881 <span class="special">}</span>
9883 <div class="section">
9884 <div class="titlepage"><div><div><h6 class="title">
9885 <a name="thread.synchronization.executors.ref.executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor" title="Constructor executor()">Constructor
9886 <code class="computeroutput"><span class="identifier">executor</span><span class="special">()</span></code></a>
9887 </h6></div></div></div>
9888 <pre class="programlisting"><span class="identifier">executor</span><span class="special">();</span>
9890 <div class="variablelist">
9891 <p class="title"><b></b></p>
9892 <dl class="variablelist">
9893 <dt><span class="term">Effects:</span></dt>
9895 Constructs a executor.
9897 <dt><span class="term">Throws:</span></dt>
9904 <div class="section">
9905 <div class="titlepage"><div><div><h6 class="title">
9906 <a name="thread.synchronization.executors.ref.executor.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor0" title="Destructor ~executor()">Destructor
9907 <code class="computeroutput"><span class="special">~</span><span class="identifier">executor</span><span class="special">()</span></code></a>
9908 </h6></div></div></div>
9909 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">();</span>
9911 <div class="variablelist">
9912 <p class="title"><b></b></p>
9913 <dl class="variablelist">
9914 <dt><span class="term">Effects:</span></dt>
9916 Destroys the executor.
9918 <dt><span class="term">Synchronization:</span></dt>
9920 The completion of all the closures happen before the completion
9921 of the executor destructor.
9927 <div class="section">
9928 <div class="titlepage"><div><div><h5 class="title">
9929 <a name="thread.synchronization.executors.ref.executor_adaptor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor" title="Template Class executor_adaptor">Template
9930 Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a>
9931 </h5></div></div></div>
9933 Polymorphic adaptor of a model of Executor to an executor.
9935 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
9936 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9937 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Executor</span><span class="special">></span>
9938 <span class="keyword">class</span> <span class="identifier">executor_adaptor</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">executor</span>
9939 <span class="special">{</span>
9940 <span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">;</span> <span class="comment">// for exposition only</span>
9941 <span class="keyword">public</span><span class="special">:</span>
9942 <span class="keyword">typedef</span> <span class="identifier">executor</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span>
9944 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9945 <span class="identifier">executor_adaptor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9947 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span>
9948 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
9950 <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
9952 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
9953 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
9955 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
9956 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&</span> <span class="identifier">closure</span><span class="special">);</span>
9958 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
9960 <span class="special">};</span>
9961 <span class="special">}</span>
9963 <div class="section">
9964 <div class="titlepage"><div><div><h6 class="title">
9965 <a name="thread.synchronization.executors.ref.executor_adaptor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.constructor" title="Constructor executor_adaptor(Args&& ...)">Constructor
9966 <code class="computeroutput"><span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span>
9967 <span class="special">...)</span></code></a>
9968 </h6></div></div></div>
9969 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span>
9970 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
9972 <div class="variablelist">
9973 <p class="title"><b></b></p>
9974 <dl class="variablelist">
9975 <dt><span class="term">Effects:</span></dt>
9977 Constructs a executor_adaptor.
9979 <dt><span class="term">Throws:</span></dt>
9986 <div class="section">
9987 <div class="titlepage"><div><div><h6 class="title">
9988 <a name="thread.synchronization.executors.ref.executor_adaptor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.destructor" title="Destructor ~executor_adaptor()">Destructor
9989 <code class="computeroutput"><span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">()</span></code></a>
9990 </h6></div></div></div>
9991 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">();</span>
9993 <div class="variablelist">
9994 <p class="title"><b></b></p>
9995 <dl class="variablelist">
9996 <dt><span class="term">Effects:</span></dt>
9998 Destroys the executor_adaptor.
10000 <dt><span class="term">Synchronization:</span></dt>
10002 The completion of all the closures happen before the completion
10003 of the executor destructor.
10008 <div class="section">
10009 <div class="titlepage"><div><div><h6 class="title">
10010 <a name="thread.synchronization.executors.ref.executor_adaptor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.underlying_executor" title="Function member underlying_executor()">Function
10011 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10012 </h6></div></div></div>
10013 <pre class="programlisting"><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10015 <div class="variablelist">
10016 <p class="title"><b></b></p>
10017 <dl class="variablelist">
10018 <dt><span class="term">Return:</span></dt>
10020 The underlying executor instance.
10022 <dt><span class="term">Throws:</span></dt>
10030 <div class="section">
10031 <div class="titlepage"><div><div><h5 class="title">
10032 <a name="thread.synchronization.executors.ref.generic_executor_ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref" title="Class generic_executor_ref">Class
10033 <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a>
10034 </h5></div></div></div>
10036 Executor abstract base class.
10038 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">generic_executor_ref</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10039 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10040 <span class="keyword">class</span> <span class="identifier">generic_executor_ref</span>
10041 <span class="special">{</span>
10042 <span class="keyword">public</span><span class="special">:</span>
10043 <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">generic_executor_ref</span> <span class="keyword">const</span><span class="special">&);</span>
10044 <span class="identifier">generic_executor_ref</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">generic_executor_ref</span> <span class="keyword">const</span><span class="special">&);</span>
10046 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span>
10047 <span class="identifier">executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span>
10048 <span class="identifier">generic_executor_ref</span><span class="special">()</span> <span class="special">{};</span>
10050 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10051 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10053 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
10054 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
10056 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10057 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
10058 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
10059 <span class="special">};</span>
10060 <span class="special">}</span>
10063 <div class="section">
10064 <div class="titlepage"><div><div><h5 class="title">
10065 <a name="thread.synchronization.executors.ref.serial_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor" title="Class serial_executor">Class
10066 <code class="computeroutput"><span class="identifier">serial_executor</span></code></a>
10067 </h5></div></div></div>
10069 A serial executor ensuring that there are no two work units that executes
10072 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">serial_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10073 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10074 <span class="keyword">class</span> <span class="identifier">serial_executor</span>
10075 <span class="special">{</span>
10076 <span class="keyword">public</span><span class="special">:</span>
10077 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10078 <span class="identifier">serial_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10080 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span>
10081 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span>
10083 <span class="identifier">generic_executor_ref</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10085 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10086 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10088 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
10089 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
10091 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10092 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
10093 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
10095 <span class="special">};</span>
10096 <span class="special">}</span>
10098 <div class="section">
10099 <div class="titlepage"><div><div><h6 class="title">
10100 <a name="thread.synchronization.executors.ref.serial_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.constructor" title="Constructor serial_executor(Executor&)">Constructor
10101 <code class="computeroutput"><span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&)</span></code></a>
10102 </h6></div></div></div>
10103 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span>
10104 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span>
10106 <div class="variablelist">
10107 <p class="title"><b></b></p>
10108 <dl class="variablelist">
10109 <dt><span class="term">Effects:</span></dt>
10111 Constructs a serial_executor.
10113 <dt><span class="term">Throws:</span></dt>
10120 <div class="section">
10121 <div class="titlepage"><div><div><h6 class="title">
10122 <a name="thread.synchronization.executors.ref.serial_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.destructor" title="Destructor ~serial_executor()">Destructor
10123 <code class="computeroutput"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">()</span></code></a>
10124 </h6></div></div></div>
10125 <pre class="programlisting"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">();</span>
10127 <div class="variablelist">
10128 <p class="title"><b></b></p>
10129 <dl class="variablelist">
10130 <dt><span class="term">Effects:</span></dt>
10132 Destroys the serial_executor.
10134 <dt><span class="term">Synchronization:</span></dt>
10136 The completion of all the closures happen before the completion
10137 of the executor destructor.
10142 <div class="section">
10143 <div class="titlepage"><div><div><h6 class="title">
10144 <a name="thread.synchronization.executors.ref.serial_executor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.underlying_executor" title="Function member underlying_executor()">Function
10145 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10146 </h6></div></div></div>
10147 <pre class="programlisting"><span class="identifier">generic_executor_ref</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10149 <div class="variablelist">
10150 <p class="title"><b></b></p>
10151 <dl class="variablelist">
10152 <dt><span class="term">Return:</span></dt>
10154 The underlying executor instance.
10156 <dt><span class="term">Throws:</span></dt>
10164 <div class="section">
10165 <div class="titlepage"><div><div><h5 class="title">
10166 <a name="thread.synchronization.executors.ref.inline_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor" title="Class inline_executor">Class
10167 <code class="computeroutput"><span class="identifier">inline_executor</span></code></a>
10168 </h5></div></div></div>
10170 A serial executor ensuring that there are no two work units that executes
10173 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">inline_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10174 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10175 <span class="keyword">class</span> <span class="identifier">inline_executor</span>
10176 <span class="special">{</span>
10177 <span class="keyword">public</span><span class="special">:</span>
10178 <span class="identifier">inline_executor</span><span class="special">(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10179 <span class="identifier">inline_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10181 <span class="identifier">inline_executor</span><span class="special">();</span>
10183 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10184 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10186 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
10187 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
10189 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10190 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
10191 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
10193 <span class="special">};</span>
10194 <span class="special">}</span>
10196 <div class="section">
10197 <div class="titlepage"><div><div><h6 class="title">
10198 <a name="thread.synchronization.executors.ref.inline_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.constructor" title="Constructor inline_executor()">Constructor
10199 <code class="computeroutput"><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10200 </h6></div></div></div>
10201 <pre class="programlisting"><span class="identifier">inline_executor</span><span class="special">();</span>
10203 <div class="variablelist">
10204 <p class="title"><b></b></p>
10205 <dl class="variablelist">
10206 <dt><span class="term">Effects:</span></dt>
10208 Constructs a inline_executor.
10210 <dt><span class="term">Throws:</span></dt>
10217 <div class="section">
10218 <div class="titlepage"><div><div><h6 class="title">
10219 <a name="thread.synchronization.executors.ref.inline_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.destructor" title="Destructor ~inline_executor()">Destructor
10220 <code class="computeroutput"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10221 </h6></div></div></div>
10222 <pre class="programlisting"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">();</span>
10224 <div class="variablelist">
10225 <p class="title"><b></b></p>
10226 <dl class="variablelist">
10227 <dt><span class="term">Effects:</span></dt>
10229 Destroys the inline_executor.
10231 <dt><span class="term">Synchronization:</span></dt>
10233 The completion of all the closures happen before the completion
10234 of the executor destructor.
10240 <div class="section">
10241 <div class="titlepage"><div><div><h5 class="title">
10242 <a name="thread.synchronization.executors.ref.basic_thread_pool"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool" title="Class basic_thread_pool">Class
10243 <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a>
10244 </h5></div></div></div>
10246 A thread pool with up to a fixed number of threads.
10248 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10249 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10250 <span class="keyword">class</span> <span class="identifier">basic_thread_pool</span>
10251 <span class="special">{</span>
10252 <span class="keyword">public</span><span class="special">:</span>
10254 <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="identifier">basic_thread_pool</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10255 <span class="identifier">basic_thread_pool</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_thread_pool</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10257 <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">());</span>
10258 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">AtThreadEntry</span><span class="special">></span>
10259 <span class="identifier">basic_thread_pool</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="identifier">AtThreadEntry</span> <span class="identifier">at_thread_entry</span><span class="special">);</span>
10260 <span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span>
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>
10265 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
10266 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
10268 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10270 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
10271 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
10273 <span class="special">};</span>
10274 <span class="special">}</span>
10276 <div class="section">
10277 <div class="titlepage"><div><div><h6 class="title">
10278 <a name="thread.synchronization.executors.ref.basic_thread_pool.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.constructor" title="Constructor basic_thread_pool(unsigned const)">Constructor
10279 <code class="computeroutput"><span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span><span class="special">)</span></code></a>
10280 </h6></div></div></div>
10281 <div class="variablelist">
10282 <p class="title"><b></b></p>
10283 <dl class="variablelist">
10284 <dt><span class="term">Effects:</span></dt>
10286 creates a thread pool that runs closures on <code class="computeroutput"><span class="identifier">thread_count</span></code>
10289 <dt><span class="term">Throws:</span></dt>
10291 Whatever exception is thrown while initializing the needed resources.
10296 <div class="section">
10297 <div class="titlepage"><div><div><h6 class="title">
10298 <a name="thread.synchronization.executors.ref.basic_thread_pool.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.destructor" title="Destructor ~basic_thread_pool()">Destructor
10299 <code class="computeroutput"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">()</span></code></a>
10300 </h6></div></div></div>
10301 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span>
10303 <div class="variablelist">
10304 <p class="title"><b></b></p>
10305 <dl class="variablelist">
10306 <dt><span class="term">Effects:</span></dt>
10308 Destroys the thread pool.
10310 <dt><span class="term">Synchronization:</span></dt>
10312 The completion of all the closures happen before the completion
10313 of the executor destructor.
10319 <div class="section">
10320 <div class="titlepage"><div><div><h5 class="title">
10321 <a name="thread.synchronization.executors.ref.loop_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor" title="Class loop_executor">Class
10322 <code class="computeroutput"><span class="identifier">loop_executor</span></code></a>
10323 </h5></div></div></div>
10325 A user scheduled executor.
10327 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">loop_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10328 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10329 <span class="keyword">class</span> <span class="identifier">loop_executor</span>
10330 <span class="special">{</span>
10331 <span class="keyword">public</span><span class="special">:</span>
10333 <span class="identifier">loop_executor</span><span class="special">(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10334 <span class="identifier">loop_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10336 <span class="identifier">loop_executor</span><span class="special">();</span>
10337 <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
10339 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10340 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10342 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span>
10343 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span>
10345 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10346 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span>
10347 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span>
10349 <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
10350 <span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
10351 <span class="special">};</span>
10352 <span class="special">}</span>
10354 <div class="section">
10355 <div class="titlepage"><div><div><h6 class="title">
10356 <a name="thread.synchronization.executors.ref.loop_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.constructor" title="Constructor loop_executor()">Constructor
10357 <code class="computeroutput"><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
10358 </h6></div></div></div>
10359 <pre class="programlisting"><span class="identifier">loop_executor</span><span class="special">();</span>
10361 <div class="variablelist">
10362 <p class="title"><b></b></p>
10363 <dl class="variablelist">
10364 <dt><span class="term">Effects:</span></dt>
10366 creates a executor that runs closures using one of its closure-executing
10369 <dt><span class="term">Throws:</span></dt>
10371 Whatever exception is thrown while initializing the needed resources.
10376 <div class="section">
10377 <div class="titlepage"><div><div><h6 class="title">
10378 <a name="thread.synchronization.executors.ref.loop_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.destructor" title="Destructor ~loop_executor()">Destructor
10379 <code class="computeroutput"><span class="special">~</span><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
10380 </h6></div></div></div>
10381 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
10383 <div class="variablelist">
10384 <p class="title"><b></b></p>
10385 <dl class="variablelist">
10386 <dt><span class="term">Effects:</span></dt>
10388 Destroys the executor.
10390 <dt><span class="term">Synchronization:</span></dt>
10392 The completion of all the closures happen before the completion
10393 of the executor destructor.
10398 <div class="section">
10399 <div class="titlepage"><div><div><h6 class="title">
10400 <a name="thread.synchronization.executors.ref.loop_executor.loop"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.loop" title="Function member loop()">Function
10401 member <code class="computeroutput"><span class="identifier">loop</span><span class="special">()</span></code></a>
10402 </h6></div></div></div>
10403 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
10405 <div class="variablelist">
10406 <p class="title"><b></b></p>
10407 <dl class="variablelist">
10408 <dt><span class="term">Return:</span></dt>
10410 reschedule works until <code class="computeroutput"><span class="identifier">closed</span><span class="special">()</span></code> or empty.
10412 <dt><span class="term">Throws:</span></dt>
10414 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
10420 <div class="section">
10421 <div class="titlepage"><div><div><h6 class="title">
10422 <a name="thread.synchronization.executors.ref.loop_executor.run_queued_closures"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.run_queued_closures" title="Function member run_queued_closures()">Function
10423 member <code class="computeroutput"><span class="identifier">run_queued_closures</span><span class="special">()</span></code></a>
10424 </h6></div></div></div>
10425 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
10427 <div class="variablelist">
10428 <p class="title"><b></b></p>
10429 <dl class="variablelist">
10430 <dt><span class="term">Return:</span></dt>
10432 reschedule the enqueued works.
10434 <dt><span class="term">Throws:</span></dt>
10436 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
10445 <div class="section">
10446 <div class="titlepage"><div><div><h3 class="title">
10447 <a name="thread.synchronization.futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures" title="Futures">Futures</a>
10448 </h3></div></div></div>
10449 <div class="toc"><dl class="toc">
10450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.overview">Overview</a></span></dt>
10451 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.creating">Creating asynchronous
10452 values</a></span></dt>
10453 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.lazy_futures">Wait Callbacks
10454 and Lazy Futures</a></span></dt>
10455 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.at_thread_exit">Handling
10456 Detached Threads and Thread Specific Variables</a></span></dt>
10457 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.async">Executing asynchronously</a></span></dt>
10458 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.shared">Shared Futures</a></span></dt>
10459 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.make_ready_future">Making
10460 immediate futures easier</a></span></dt>
10461 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.then">Associating future
10462 continuations</a></span></dt>
10463 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference">Futures Reference</a></span></dt>
10465 <div class="section">
10466 <div class="titlepage"><div><div><h4 class="title">
10467 <a name="thread.synchronization.futures.overview"></a><a class="link" href="synchronization.html#thread.synchronization.futures.overview" title="Overview">Overview</a>
10468 </h4></div></div></div>
10470 The futures library provides a means of handling synchronous future values,
10471 whether those values are generated by another thread, or on a single thread
10472 in response to external stimuli, or on-demand.
10475 This is done through the provision of four class templates: <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> which are used to
10476 retrieve the asynchronous results, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> which are used to
10477 generate the asynchronous results.
10480 An instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> holds the one and only
10481 reference to a result. Ownership can be transferred between instances using
10482 the move constructor or move-assignment operator, but at most one instance
10483 holds a reference to a given asynchronous result. When the result is ready,
10484 it is returned from <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10485 by rvalue-reference to allow the result to be moved or copied as appropriate
10489 On the other hand, many instances of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> may reference the
10490 same result. Instances can be freely copied and assigned, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10491 returns a non <code class="computeroutput"><span class="keyword">const</span></code> reference
10492 so that multiple calls to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10493 are safe. You can move an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> into an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, thus transferring
10494 ownership of the associated asynchronous result, but not vice-versa.
10497 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous
10498 tasks. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
10499 returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> that will contain the result
10503 You can wait for futures either individually or with one of the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_any</span><span class="special">()</span></code></a>
10504 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_all</span><span class="special">()</span></code></a>
10508 <div class="section">
10509 <div class="titlepage"><div><div><h4 class="title">
10510 <a name="thread.synchronization.futures.creating"></a><a class="link" href="synchronization.html#thread.synchronization.futures.creating" title="Creating asynchronous values">Creating asynchronous
10512 </h4></div></div></div>
10514 You can set the value in a future with either a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> is a callable object
10515 that wraps a function or callable object. When the packaged task is invoked,
10516 it invokes the contained function in turn, and populates a future with
10517 the return value. This is an answer to the perennial question: "how
10518 do I return a value from a thread?": package the function you wish
10519 to run as a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> and pass the packaged
10520 task to the thread constructor. The future retrieved from the packaged
10521 task can then be used to obtain the return value. If the function throws
10522 an exception, that is stored in the future in place of the return value.
10524 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span>
10525 <span class="special">{</span>
10526 <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
10527 <span class="special">}</span>
10529 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">pt</span><span class="special">(</span><span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">);</span>
10530 <span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">fi</span><span class="special">=</span><span class="identifier">pt</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">();</span>
10532 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">task</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pt</span><span class="special">));</span> <span class="comment">// launch task on a thread</span>
10534 <span class="identifier">fi</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span> <span class="comment">// wait for it to finish</span>
10536 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span>
10537 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span>
10538 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span>
10539 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span>
10540 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
10543 A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> is a bit more low level:
10544 it just provides explicit functions to store a value or an exception in
10545 the associated future. A promise can therefore be used where the value
10546 may come from more than one possible source, or where a single operation
10547 may produce multiple values.
10549 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">pi</span><span class="special">;</span>
10550 <span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">fi</span><span class="special">;</span>
10551 <span class="identifier">fi</span><span class="special">=</span><span class="identifier">pi</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">();</span>
10553 <span class="identifier">pi</span><span class="special">.</span><span class="identifier">set_value</span><span class="special">(</span><span class="number">42</span><span class="special">);</span>
10555 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span>
10556 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span>
10557 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span>
10558 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span>
10559 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
10562 <div class="section">
10563 <div class="titlepage"><div><div><h4 class="title">
10564 <a name="thread.synchronization.futures.lazy_futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures.lazy_futures" title="Wait Callbacks and Lazy Futures">Wait Callbacks
10565 and Lazy Futures</a>
10566 </h4></div></div></div>
10568 Both <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> support <span class="emphasis"><em>wait
10569 callbacks</em></span> that are invoked when a thread blocks in a call to
10570 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
10571 or <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
10572 on a future that is waiting for the result from the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, in the thread that
10573 is doing the waiting. These can be set using the <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> member function on the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> in question.
10576 This allows <span class="emphasis"><em>lazy futures</em></span> where the result is not actually
10577 computed until it is needed by some thread. In the example below, the call
10578 to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
10579 invokes the callback <code class="computeroutput"><span class="identifier">invoke_lazy_task</span></code>,
10580 which runs the task to set the value. If you remove the call to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>, the task is not ever run.
10582 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span>
10583 <span class="special">{</span>
10584 <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
10585 <span class="special">}</span>
10587 <span class="keyword">void</span> <span class="identifier">invoke_lazy_task</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">>&</span> <span class="identifier">task</span><span class="special">)</span>
10588 <span class="special">{</span>
10589 <span class="keyword">try</span>
10590 <span class="special">{</span>
10591 <span class="identifier">task</span><span class="special">();</span>
10592 <span class="special">}</span>
10593 <span class="keyword">catch</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span><span class="special">&)</span>
10594 <span class="special">{}</span>
10595 <span class="special">}</span>
10597 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10598 <span class="special">{</span>
10599 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">task</span><span class="special">(</span><span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">);</span>
10600 <span class="identifier">task</span><span class="special">.</span><span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">invoke_lazy_task</span><span class="special">);</span>
10601 <span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">task</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">());</span>
10603 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
10604 <span class="special">}</span>
10607 <div class="section">
10608 <div class="titlepage"><div><div><h4 class="title">
10609 <a name="thread.synchronization.futures.at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.at_thread_exit" title="Handling Detached Threads and Thread Specific Variables">Handling
10610 Detached Threads and Thread Specific Variables</a>
10611 </h4></div></div></div>
10613 Detached threads pose a problem for objects with thread storage duration.
10614 If we use a mechanism other than <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">__join</span></code>
10615 to wait for a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> to complete its work -
10616 such as waiting for a future to be ready - then the destructors of thread
10617 specific variables will still be running after the waiting thread has resumed.
10618 This section explain how the standard mechanism can be used to make such
10619 synchronization safe by ensuring that the objects with thread storage duration
10620 are destroyed prior to the future being made ready. e.g.
10622 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">find_the_answer</span><span class="special">();</span> <span class="comment">// uses thread specific objects</span>
10623 <span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">>&&</span> <span class="identifier">p</span><span class="special">)</span>
10624 <span class="special">{</span>
10625 <span class="identifier">p</span><span class="special">.</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">find_the_answer</span><span class="special">());</span>
10626 <span class="special">}</span>
10628 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10629 <span class="special">{</span>
10630 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">p</span><span class="special">;</span>
10631 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">thread_func</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">p</span><span class="special">));</span>
10632 <span class="identifier">t</span><span class="special">.</span><span class="identifier">detach</span><span class="special">();</span> <span class="comment">// we're going to wait on the future</span>
10633 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">().</span><span class="identifier">get</span><span class="special">()<<</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
10634 <span class="special">}</span>
10637 When the call to <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
10638 returns, we know that not only is the future value ready, but the thread
10639 specific variables on the other thread have also been destroyed.
10642 Such mechanisms are provided for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span></code>,
10643 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code>.
10646 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">task_executor</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">void</span><span class="special">(</span><span class="keyword">int</span><span class="special">)></span> <span class="identifier">task</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">param</span><span class="special">)</span>
10647 <span class="special">{</span>
10648 <span class="identifier">task</span><span class="special">.</span><span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">param</span><span class="special">);</span> <span class="comment">// execute stored task</span>
10649 <span class="special">}</span> <span class="comment">// destroy thread specific and wake threads waiting on futures from task</span>
10652 Other threads can wait on a future obtained from the task without having
10653 to worry about races due to the execution of destructors of the thread
10654 specific objects from the task's thread.
10656 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cv</span><span class="special">;</span>
10657 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
10658 <span class="identifier">complex_type</span> <span class="identifier">the_data</span><span class="special">;</span>
10659 <span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
10661 <span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">()</span>
10662 <span class="special">{</span>
10663 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
10664 <span class="identifier">the_data</span><span class="special">=</span><span class="identifier">find_the_answer</span><span class="special">();</span>
10665 <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
10666 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">cv</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">lk</span><span class="special">));</span>
10667 <span class="special">}</span> <span class="comment">// destroy thread specific objects, notify cv, unlock mutex</span>
10669 <span class="keyword">void</span> <span class="identifier">waiting_thread</span><span class="special">()</span>
10670 <span class="special">{</span>
10671 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
10672 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
10673 <span class="special">{</span>
10674 <span class="identifier">cv</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lk</span><span class="special">);</span>
10675 <span class="special">}</span>
10676 <span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">);</span>
10677 <span class="special">}</span>
10680 The waiting thread is guaranteed that the thread specific objects used
10681 by <code class="computeroutput"><span class="identifier">thread_func</span><span class="special">()</span></code>
10682 have been destroyed by the time <code class="computeroutput"><span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">)</span></code> is called. If the lock on <code class="computeroutput"><span class="identifier">m</span></code> is released and re-acquired after setting
10683 <code class="computeroutput"><span class="identifier">data_ready</span></code> and before calling
10684 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">()</span></code>
10685 then this does NOT hold, since the thread may return from the wait due
10686 to a spurious wake-up.
10689 <div class="section">
10690 <div class="titlepage"><div><div><h4 class="title">
10691 <a name="thread.synchronization.futures.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.async" title="Executing asynchronously">Executing asynchronously</a>
10692 </h4></div></div></div>
10694 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous
10695 tasks to make use of the available hardware concurrency. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> returns a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span></code>
10696 that will contain the result of the task. Depending on the launch policy,
10697 the task is either run asynchronously on its own thread or synchronously
10698 on whichever thread calls the <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> member functions on that <code class="computeroutput"><span class="identifier">future</span></code>.
10701 A launch policy of either boost::launch::async, which asks the runtime
10702 to create an asynchronous thread, or boost::launch::deferred, which indicates
10703 you simply want to defer the function call until a later time (lazy evaluation).
10704 This argument is optional - if you omit it your function will use the default
10708 For example, consider computing the sum of a very large array. The first
10709 task is to not compute asynchronously when the overhead would be significant.
10710 The second task is to split the work into two pieces, one executed by the
10711 host thread and one executed asynchronously.
10713 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="keyword">int</span><span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">size</span><span class="special">)</span>
10714 <span class="special">{</span>
10715 <span class="keyword">int</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10716 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">size</span> <span class="special"><</span> <span class="number">1000</span> <span class="special">)</span>
10717 <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
10718 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">data</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
10719 <span class="keyword">else</span> <span class="special">{</span>
10720 <span class="keyword">auto</span> <span class="identifier">handle</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">parallel_sum</span><span class="special">,</span> <span class="identifier">data</span><span class="special">+</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">,</span> <span class="identifier">size</span><span class="special">-</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span>
10721 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span>
10722 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">handle</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
10723 <span class="special">}</span>
10724 <span class="keyword">return</span> <span class="identifier">sum</span><span class="special">;</span>
10725 <span class="special">}</span>
10728 <div class="section">
10729 <div class="titlepage"><div><div><h4 class="title">
10730 <a name="thread.synchronization.futures.shared"></a><a class="link" href="synchronization.html#thread.synchronization.futures.shared" title="Shared Futures">Shared Futures</a>
10731 </h4></div></div></div>
10733 <code class="computeroutput"><span class="identifier">shared_future</span></code> is designed
10734 to be shared between threads, that is to allow multiple concurrent get
10738 <a name="thread.synchronization.futures.shared.h0"></a>
10739 <span class="phrase"><a name="thread.synchronization.futures.shared.multiple_get"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.multiple_get">Multiple get</a>
10742 The second <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
10743 call in the following example is undefined.
10745 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">bad_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
10747 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">);</span>
10748 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10749 <span class="special">{</span>
10750 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10751 <span class="special">}</span> <span class="keyword">else</span>
10752 <span class="special">{</span>
10753 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10754 <span class="special">}</span>
10755 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is undefined</span>
10756 <span class="special">}</span>
10759 Using a <code class="computeroutput"><span class="identifier">shared_future</span></code> solves
10762 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">good_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
10764 <span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">);</span>
10765 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10766 <span class="special">{</span>
10767 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10768 <span class="special">}</span> <span class="keyword">else</span>
10769 <span class="special">{</span>
10770 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10771 <span class="special">}</span>
10772 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
10773 <span class="special">}</span>
10776 <a name="thread.synchronization.futures.shared.h1"></a>
10777 <span class="phrase"><a name="thread.synchronization.futures.shared.share__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.share__">share()</a>
10780 Namming the return type when declaring the <code class="computeroutput"><span class="identifier">shared_future</span></code>
10781 is needed; auto is not available within template argument lists. Here
10782 <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code>
10783 could be used to simplify the code
10785 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">better_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
10787 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span>
10788 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10789 <span class="special">{</span>
10790 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10791 <span class="special">}</span> <span class="keyword">else</span>
10792 <span class="special">{</span>
10793 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10794 <span class="special">}</span>
10795 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
10796 <span class="special">}</span>
10799 <a name="thread.synchronization.futures.shared.h2"></a>
10800 <span class="phrase"><a name="thread.synchronization.futures.shared.writing_on_get__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.writing_on_get__">Writing
10804 The user can either read or write the future avariable.
10806 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">write_to_get</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
10808 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span>
10809 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10810 <span class="special">{</span>
10811 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10812 <span class="special">}</span> <span class="keyword">else</span>
10813 <span class="special">{</span>
10814 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond2</span> <span class="special">)</span>
10815 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
10816 <span class="keyword">else</span>
10817 <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">=</span> <span class="identifier">something</span><span class="special">();</span> <span class="comment">// assign to non-const reference. </span>
10818 <span class="special">}</span>
10819 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
10820 <span class="special">}</span>
10823 This works because the <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><>::</span><span class="identifier">get</span><span class="special">()</span></code> function returns a non-const reference
10824 to the appropriate storage. Of course the access to this storage must be
10825 ensured by the user. The library doesn't ensure the access to the internal
10826 storage is thread safe.
10829 There has been some work by the C++ standard committe on an <code class="computeroutput"><span class="identifier">atomic_future</span></code> that behaves as an <code class="computeroutput"><span class="identifier">atomic</span></code> variable, that is is thread_safe,
10830 and a <code class="computeroutput"><span class="identifier">shared_future</span></code> that
10831 can be shared between several threads, but there were not enough consensus
10832 and time to get it ready for C++11.
10835 <div class="section">
10836 <div class="titlepage"><div><div><h4 class="title">
10837 <a name="thread.synchronization.futures.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future" title="Making immediate futures easier">Making
10838 immediate futures easier</a>
10839 </h4></div></div></div>
10841 Some functions may know the value at the point of construction. In these
10842 cases the value is immediately available, but needs to be returned as a
10843 future or shared_future. By using make_ready_future a future can be created
10844 which holds a pre-computed result in its shared state.
10847 Without these features it is non-trivial to create a future directly from
10848 a value. First a promise must be created, then the promise is set, and
10849 lastly the future is retrieved from the promise. This can now be done with
10853 <a name="thread.synchronization.futures.make_ready_future.h0"></a>
10854 <span class="phrase"><a name="thread.synchronization.futures.make_ready_future.make_ready_future"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future.make_ready_future">make_ready_future</a>
10857 This function creates a future for a given value. If no value is given
10858 then a future<void> is returned. This function is primarily useful
10859 in cases where sometimes, the return value is immediately available, but
10860 sometimes it is not. The example below illustrates, that in an error path
10861 the value is known immediately, however in other paths the function must
10862 return an eventual value represented as a future.
10864 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">compute</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span>
10865 <span class="special">{</span>
10866 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_ready_future</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
10867 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special"><</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_ready_future</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Error"</span><span class="special">));</span>
10868 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">([]()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">x</span><span class="special">+</span><span class="number">1</span><span class="special">;</span> <span class="special">});</span>
10869 <span class="keyword">return</span> <span class="identifier">f1</span><span class="special">;</span>
10870 <span class="special">}</span>
10873 There are two variations of this function. The first takes a value of any
10874 type, and returns a future of that type. The input value is passed to the
10875 shared state of the returned future. The second version takes no input
10876 and returns a future<void>.
10879 <div class="section">
10880 <div class="titlepage"><div><div><h4 class="title">
10881 <a name="thread.synchronization.futures.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.then" title="Associating future continuations">Associating future
10883 </h4></div></div></div>
10885 In asynchronous programming, it is very common for one asynchronous operation,
10886 on completion, to invoke a second operation and pass data to it. The current
10887 C++ standard does not allow one to register a continuation to a future.
10888 With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>,
10889 instead of waiting for the result, a continuation is "attached"
10890 to the asynchronous operation, which is invoked when the result is ready.
10891 Continuations registered using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code> function will help to avoid blocking
10892 waits or wasting threads on polling, greatly improving the responsiveness
10893 and scalability of an application.
10896 <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
10897 provides the ability to sequentially compose two futures by declaring one
10898 to be the continuation of another. With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
10899 the antecedent future is ready (has a value or exception stored in the
10900 shared state) before the continuation starts as instructed by the lambda
10904 In the example below the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">string</span><span class="special">></span></code> <code class="computeroutput"><span class="identifier">f2</span></code>
10905 is registered to be a continuation of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code> <code class="computeroutput"><span class="identifier">f1</span></code>
10906 using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> member function. This operation takes
10907 a lambda function which describes how <code class="computeroutput"><span class="identifier">f2</span></code>
10908 should proceed after <code class="computeroutput"><span class="identifier">f1</span></code>
10911 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">future</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
10912 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
10913 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10914 <span class="special">{</span>
10915 <span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f1</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">([]()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">123</span><span class="special">;</span> <span class="special">});</span>
10916 <span class="identifier">future</span><span class="special"><</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">f2</span> <span class="special">=</span> <span class="identifier">f1</span><span class="special">.</span><span class="identifier">then</span><span class="special">([](</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">();</span> <span class="comment">// here .get() won't block });</span>
10917 <span class="special">}</span>
10920 One key feature of this function is the ability to chain multiple asynchronous
10921 operations. In asynchronous programming, it's common to define a sequence
10922 of operations, in which each continuation executes only when the previous
10923 one completes. In some cases, the antecedent future produces a value that
10924 the continuation accepts as input. By using <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>, creating a chain of continuations becomes
10925 straightforward and intuitive:
10927 <pre class="programlisting"><span class="identifier">myFuture</span><span class="special">.</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span>
10930 Some points to note are:
10932 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
10933 <li class="listitem">
10934 Each continuation will not begin until the preceding has completed.
10936 <li class="listitem">
10937 If an exception is thrown, the following continuation can handle it
10938 in a try-catch block
10944 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
10945 <li class="listitem">
10946 Lambda function: One option which can be considered is to take two
10947 functions, one for success and one for error handling. However this
10948 option has not been retained for the moment. The lambda function takes
10949 a future as its input which carries the exception through. This makes
10950 propagating exceptions straightforward. This approach also simplifies
10951 the chaining of continuations.
10953 <li class="listitem">
10954 Scheduler: Providing an overload to <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>, to take a scheduler reference
10955 places great flexibility over the execution of the future in the programmer's
10956 hand. As described above, often taking a launch policy is not sufficient
10957 for powerful asynchronous operations. The lifetime of the scheduler
10958 must outlive the continuation.
10960 <li class="listitem">
10961 Launch policy: if the additional flexibility that the scheduler provides
10966 Return values: The decision to return a future was based primarily on the
10967 ability to chain multiple continuations using <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>.
10968 This benefit of composability gives the programmer incredible control and
10969 flexibility over their code. Returning a <code class="computeroutput"><span class="identifier">future</span></code>
10970 object rather than a <code class="computeroutput"><span class="identifier">shared_future</span></code>
10971 is also a much cheaper operation thereby improving performance. A <code class="computeroutput"><span class="identifier">shared_future</span></code> object is not necessary
10972 to take advantage of the chaining feature. It is also easy to go from a
10973 <code class="computeroutput"><span class="identifier">future</span></code> to a <code class="computeroutput"><span class="identifier">shared_future</span></code> when needed using future::share().
10976 <div class="section">
10977 <div class="titlepage"><div><div><h4 class="title">
10978 <a name="thread.synchronization.futures.reference"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference" title="Futures Reference">Futures Reference</a>
10979 </h4></div></div></div>
10980 <div class="toc"><dl class="toc">
10981 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_state">Enumeration
10982 <code class="computeroutput"><span class="identifier">state</span></code></a></span></dt>
10983 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_errc">Enumeration
10984 <code class="computeroutput"><span class="identifier">future_errc</span></code></a></span></dt>
10985 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.launch">Enumeration
10986 <code class="computeroutput"><span class="identifier">launch</span></code></a></span></dt>
10987 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum">Specialization
10988 <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span></code></a></span></dt>
10989 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_code">Non-member
10990 function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a></span></dt>
10991 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_condition">Non-member
10992 function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a></span></dt>
10993 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_category">Non-member
10994 function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a></span></dt>
10995 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error">Class
10996 <code class="computeroutput"><span class="identifier">future_error</span></code></a></span></dt>
10997 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_status">Enumeration
10998 <code class="computeroutput"><span class="identifier">future_status</span></code></a></span></dt>
10999 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error0">Class
11000 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a></span></dt>
11001 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.unique_future"><code class="computeroutput"><span class="identifier">future</span></code> class template</a></span></dt>
11002 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.shared_future"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a></span></dt>
11003 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.promise"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a></span></dt>
11004 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.packaged_task"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a></span></dt>
11005 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.decay_copy">Non-member
11006 function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a></span></dt>
11007 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.async">Non-member
11008 function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a></span></dt>
11009 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_any">Non-member
11010 function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
11011 - EXTENSION</a></span></dt>
11012 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_all">Non-member
11013 function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
11014 - EXTENSION</a></span></dt>
11015 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_all">Non-member
11016 function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
11017 - EXTENSION</a></span></dt>
11018 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_any">Non-member
11019 function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
11020 - EXTENSION</a></span></dt>
11021 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_ready_future">Non-member
11022 function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11023 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_exceptional">Non-member
11024 function <code class="computeroutput"><span class="identifier">make_exceptional</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11025 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_future">Non-member
11026 function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
11027 DEPRECATED</a></span></dt>
11028 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_shared_future">Non-member
11029 function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a></span></dt>
11031 <pre class="programlisting"><span class="comment">//#include <boost/thread/future.hpp></span>
11033 <span class="keyword">namespace</span> <span class="identifier">boost</span>
11034 <span class="special">{</span>
11035 <span class="keyword">namespace</span> <span class="identifier">future_state</span> <span class="comment">// EXTENSION</span>
11036 <span class="special">{</span>
11037 <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span>
11038 <span class="special">}</span>
11040 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11041 <span class="special">{</span>
11042 <span class="identifier">broken_promise</span><span class="special">,</span>
11043 <span class="identifier">future_already_retrieved</span><span class="special">,</span>
11044 <span class="identifier">promise_already_satisfied</span><span class="special">,</span>
11045 <span class="identifier">no_state</span>
11046 <span class="special">};</span>
11048 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
11049 <span class="special">{</span>
11050 <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11051 <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11052 <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11053 <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
11054 <span class="special">};</span>
11056 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
11057 <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
11058 <span class="special">};</span>
11060 <span class="keyword">namespace</span> <span class="identifier">system</span>
11061 <span class="special">{</span>
11062 <span class="keyword">template</span> <span class="special"><></span>
11063 <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>
11065 <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11067 <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11068 <span class="special">}</span>
11070 <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&</span> <span class="identifier">future_category</span><span class="special">();</span>
11072 <span class="keyword">class</span> <span class="identifier">future_error</span><span class="special">;</span>
11074 <span class="keyword">class</span> <span class="identifier">exceptional_ptr</span><span class="special">;</span>
11076 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
11077 <span class="keyword">class</span> <span class="identifier">promise</span><span class="special">;</span>
11079 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
11080 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11082 <span class="keyword">namespace</span> <span class="identifier">container</span> <span class="special">{</span>
11083 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">></span>
11084 <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special"><</span><span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>,</span> <span class="identifier">Alloc</span><span class="special">>::</span> <span class="identifier">true_type</span><span class="special">;</span>
11085 <span class="special">}</span>
11087 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
11088 <span class="keyword">class</span> <span class="identifier">future</span><span class="special">;</span>
11090 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
11091 <span class="keyword">class</span> <span class="identifier">shared_future</span><span class="special">;</span>
11093 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span>
11094 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
11095 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">S</span><span class="special">>&,</span> <span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">S</span><span class="special">>&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11097 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">></span>
11098 <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special"><</span><span class="identifier">packaged_task</span> <span class="special"><</span><span class="identifier">S</span><span class="special">>,</span> <span class="identifier">Alloc</span><span class="special">>;</span>
11100 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
11101 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span>
11102 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
11103 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
11104 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span>
11105 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
11107 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
11108 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
11109 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
11110 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
11111 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
11112 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
11113 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
11114 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
11115 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
11117 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span>
11118 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11119 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FS</span><span class="special">></span>
11120 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11122 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span>
11123 <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11124 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">Fs</span><span class="special">></span>
11125 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11127 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span>
11128 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span>
11129 <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
11130 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span>
11131 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">>...></span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span>
11132 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span>
11133 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span>
11134 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11135 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span>
11136 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">>...></span> <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span>
11138 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
11139 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
11140 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span>
11142 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
11143 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11144 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11146 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11147 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
11148 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11149 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11152 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
11153 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
11154 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span>
11156 <div class="section">
11157 <div class="titlepage"><div><div><h5 class="title">
11158 <a name="thread.synchronization.futures.reference.future_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state">Enumeration
11159 <code class="computeroutput"><span class="identifier">state</span></code></a>
11160 </h5></div></div></div>
11161 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">future_state</span>
11162 <span class="special">{</span>
11163 <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span>
11164 <span class="special">}</span>
11167 <div class="section">
11168 <div class="titlepage"><div><div><h5 class="title">
11169 <a name="thread.synchronization.futures.reference.future_errc"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_errc" title="Enumeration future_errc">Enumeration
11170 <code class="computeroutput"><span class="identifier">future_errc</span></code></a>
11171 </h5></div></div></div>
11172 <pre class="programlisting"> <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11173 <span class="special">{</span>
11174 <span class="identifier">broken_promise</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11175 <span class="identifier">future_already_retrieved</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11176 <span class="identifier">promise_already_satisfied</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11177 <span class="identifier">no_state</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span>
11178 <span class="special">}</span>
11181 <span class="identifier">The</span> <span class="keyword">enum</span> <span class="identifier">values</span> <span class="identifier">of</span> <span class="identifier">future_errc</span> <span class="identifier">are</span> <span class="identifier">distinct</span> <span class="keyword">and</span> <span class="keyword">not</span> <span class="identifier">zero</span><span class="special">.</span>
11184 <div class="section">
11185 <div class="titlepage"><div><div><h5 class="title">
11186 <a name="thread.synchronization.futures.reference.launch"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.launch" title="Enumeration launch">Enumeration
11187 <code class="computeroutput"><span class="identifier">launch</span></code></a>
11188 </h5></div></div></div>
11189 <pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
11190 <span class="special">{</span>
11191 <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11192 <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11193 <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11194 <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
11195 <span class="special">};</span>
11198 The enum type launch is a bitmask type with launch::async and launch::deferred
11199 denoting individual bits.
11202 <div class="section">
11203 <div class="titlepage"><div><div><h5 class="title">
11204 <a name="thread.synchronization.futures.reference.is_error_code_enum"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum" title="Specialization is_error_code_enum<future_errc>">Specialization
11205 <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span></code></a>
11206 </h5></div></div></div>
11207 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11208 <span class="special">{</span>
11209 <span class="keyword">template</span> <span class="special"><></span>
11210 <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>
11212 <span class="special">}</span>
11215 <div class="section">
11216 <div class="titlepage"><div><div><h5 class="title">
11217 <a name="thread.synchronization.futures.reference.make_error_code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_code" title="Non-member function make_error_code()">Non-member
11218 function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a>
11219 </h5></div></div></div>
11220 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11221 <span class="special">{</span>
11222 <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11223 <span class="special">}</span>
11225 <div class="variablelist">
11226 <p class="title"><b></b></p>
11227 <dl class="variablelist">
11228 <dt><span class="term">Returns:</span></dt>
11230 <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">e</span><span class="special">),</span>
11231 <span class="identifier">future_category</span><span class="special">())</span></code>.
11236 <div class="section">
11237 <div class="titlepage"><div><div><h5 class="title">
11238 <a name="thread.synchronization.futures.reference.make_error_condition"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_condition" title="Non-member function make_error_condition()">Non-member
11239 function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a>
11240 </h5></div></div></div>
11241 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11242 <span class="special">{</span>
11243 <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11244 <span class="special">}</span>
11246 <div class="variablelist">
11247 <p class="title"><b></b></p>
11248 <dl class="variablelist">
11249 <dt><span class="term">Returns:</span></dt>
11251 <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">future_category</span><span class="special">())</span></code>.
11256 <div class="section">
11257 <div class="titlepage"><div><div><h5 class="title">
11258 <a name="thread.synchronization.futures.reference.future_category"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_category" title="Non-member function future_category()">Non-member
11259 function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a>
11260 </h5></div></div></div>
11261 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&</span> <span class="identifier">future_category</span><span class="special">();</span>
11263 <div class="variablelist">
11264 <p class="title"><b></b></p>
11265 <dl class="variablelist">
11266 <dt><span class="term">Returns:</span></dt>
11268 A reference to an object of a type derived from class error_category.
11270 <dt><span class="term">Notes:</span></dt>
11272 The object's <code class="computeroutput"><span class="identifier">default_error_condition</span></code>
11273 and equivalent virtual functions behave as specified for the class
11274 <code class="computeroutput"><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span></code>. The object's
11275 <code class="computeroutput"><span class="identifier">name</span></code> virtual function
11276 returns a pointer to the string "future".
11281 <div class="section">
11282 <div class="titlepage"><div><div><h5 class="title">
11283 <a name="thread.synchronization.futures.reference.future_error"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error" title="Class future_error">Class
11284 <code class="computeroutput"><span class="identifier">future_error</span></code></a>
11285 </h5></div></div></div>
11286 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">future_error</span>
11287 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span>
11288 <span class="special">{</span>
11289 <span class="keyword">public</span><span class="special">:</span>
11290 <span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span>
11292 <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">code</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">no_except</span><span class="special">;</span>
11293 <span class="special">};</span>
11295 <div class="section">
11296 <div class="titlepage"><div><div><h6 class="title">
11297 <a name="thread.synchronization.futures.reference.future_error.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor" title="Constructor">Constructor</a>
11298 </h6></div></div></div>
11299 <pre class="programlisting"><span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span>
11301 <div class="variablelist">
11302 <p class="title"><b></b></p>
11303 <dl class="variablelist">
11304 <dt><span class="term">Effects:</span></dt>
11306 Constructs a future_error.
11308 <dt><span class="term">Postconditions:</span></dt>
11310 <code class="computeroutput"><span class="identifier">code</span><span class="special">()==</span><span class="identifier">ec</span></code>
11312 <dt><span class="term">Throws:</span></dt>
11319 <div class="section">
11320 <div class="titlepage"><div><div><h6 class="title">
11321 <a name="thread.synchronization.futures.reference.future_error.code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.code" title="Member function code()">Member
11322 function <code class="computeroutput"><span class="identifier">code</span><span class="special">()</span></code></a>
11323 </h6></div></div></div>
11324 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</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>
11326 <div class="variablelist">
11327 <p class="title"><b></b></p>
11328 <dl class="variablelist">
11329 <dt><span class="term">Returns:</span></dt>
11331 The value of <code class="computeroutput"><span class="identifier">ec</span></code>
11332 that was passed to the object's constructor.
11338 <div class="section">
11339 <div class="titlepage"><div><div><h5 class="title">
11340 <a name="thread.synchronization.futures.reference.future_status"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_status" title="Enumeration future_status">Enumeration
11341 <code class="computeroutput"><span class="identifier">future_status</span></code></a>
11342 </h5></div></div></div>
11343 <pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
11344 <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
11345 <span class="special">};</span>
11348 <div class="section">
11349 <div class="titlepage"><div><div><h5 class="title">
11350 <a name="thread.synchronization.futures.reference.future_error0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error0" title="Class exceptional_ptr EXPERIMENTAL">Class
11351 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a>
11352 </h5></div></div></div>
11353 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">exceptional_ptr</span>
11354 <span class="special">{</span>
11355 <span class="keyword">public</span><span class="special">:</span>
11356 <span class="identifier">exceptional_ptr</span><span class="special">();</span>
11357 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>
11358 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span>
11359 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&&</span> <span class="identifier">ex</span><span class="special">);</span>
11360 <span class="special">};</span>
11362 <div class="section">
11363 <div class="titlepage"><div><div><h6 class="title">
11364 <a name="thread.synchronization.futures.reference.future_error.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor0" title="Constructor">Constructor</a>
11365 </h6></div></div></div>
11366 <pre class="programlisting"><span class="identifier">exceptional_ptr</span><span class="special">();</span>
11367 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>
11368 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span>
11369 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&&</span> <span class="identifier">ex</span><span class="special">);</span>
11371 <div class="variablelist">
11372 <p class="title"><b></b></p>
11373 <dl class="variablelist">
11374 <dt><span class="term">Effects:</span></dt>
11376 The exception that is passed in to the constructor or the current
11377 exception if no parameter is moved into the constructed <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> if it is an
11378 rvalue. Otherwise the exception is copied into the constructed
11379 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
11381 <dt><span class="term">Postconditions:</span></dt>
11383 <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
11384 <span class="special">==</span> <span class="keyword">true</span>
11385 <span class="special">&&</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="special">=</span>
11386 <span class="keyword">true</span> <span class="special">&&</span>
11387 <span class="identifier">has_value</span><span class="special">()</span>
11388 <span class="special">=</span> <span class="keyword">false</span></code>
11390 <dt><span class="term">Throws:</span></dt>
11398 <div class="section">
11399 <div class="titlepage"><div><div><h5 class="title">
11400 <a name="thread.synchronization.futures.reference.unique_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code> class template</a>
11401 </h5></div></div></div>
11402 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
11403 <span class="keyword">class</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>
11404 <span class="special">{</span>
11406 <span class="keyword">public</span><span class="special">:</span>
11407 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11408 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11409 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11411 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
11412 <span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
11414 <span class="comment">// move support</span>
11415 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11416 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>>&&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11417 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11419 <span class="comment">// factories</span>
11420 <span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">share</span><span class="special">();</span>
11422 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
11423 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
11424 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11425 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
11426 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
11427 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11428 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
11429 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
11430 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11432 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11433 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="identifier">fallback_to</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11435 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11437 <span class="comment">// retrieving the value</span>
11438 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span>
11439 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11441 <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11443 <span class="comment">// functions to check state</span>
11444 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
11445 <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11446 <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11447 <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11449 <span class="comment">// waiting for the result to be ready</span>
11450 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
11451 <span class="keyword">template</span> <span class="special"><</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>
11452 <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
11453 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
11454 <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
11456 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span>
11457 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span>
11458 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span>
11459 <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span>
11460 <span class="preprocessor">#endif</span>
11461 <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11462 <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
11463 <span class="special">};</span>
11465 <div class="section">
11466 <div class="titlepage"><div><div><h6 class="title">
11467 <a name="thread.synchronization.futures.reference.unique_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.default_constructor" title="Default Constructor">Default
11469 </h6></div></div></div>
11470 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
11472 <div class="variablelist">
11473 <p class="title"><b></b></p>
11474 <dl class="variablelist">
11475 <dt><span class="term">Effects:</span></dt>
11477 Constructs an uninitialized <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>.
11479 <dt><span class="term">Postconditions:</span></dt>
11481 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span></code></a> returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11482 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>.
11484 <dt><span class="term">Throws:</span></dt>
11491 <div class="section">
11492 <div class="titlepage"><div><div><h6 class="title">
11493 <a name="thread.synchronization.futures.reference.unique_future.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.destructor" title="Destructor">Destructor</a>
11494 </h6></div></div></div>
11495 <pre class="programlisting"><span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
11497 <div class="variablelist">
11498 <p class="title"><b></b></p>
11499 <dl class="variablelist">
11500 <dt><span class="term">Effects:</span></dt>
11502 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11504 <dt><span class="term">Throws:</span></dt>
11511 <div class="section">
11512 <div class="titlepage"><div><div><h6 class="title">
11513 <a name="thread.synchronization.futures.reference.unique_future.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_constructor" title="Move Constructor">Move
11515 </h6></div></div></div>
11516 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
11518 <div class="variablelist">
11519 <p class="title"><b></b></p>
11520 <dl class="variablelist">
11521 <dt><span class="term">Effects:</span></dt>
11523 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers
11524 ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
11525 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11527 <dt><span class="term">Postconditions:</span></dt>
11529 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11530 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code>
11531 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a
11532 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11533 <code class="computeroutput"><span class="identifier">other</span></code> is not
11534 associated with any shared state.
11536 <dt><span class="term">Throws:</span></dt>
11540 <dt><span class="term">Notes:</span></dt>
11542 If the compiler does not support rvalue-references, this is implemented
11543 using the boost.thread move emulation.
11548 <div class="section">
11549 <div class="titlepage"><div><div><h6 class="title">
11550 <a name="thread.synchronization.futures.reference.unique_future.unwrap_move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap_move_constructor" title="Unwrap Move Constructor - EXTENSION">Unwrap
11551 Move Constructor - EXTENSION</a>
11552 </h6></div></div></div>
11553 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>>&&</span> <span class="identifier">other</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11555 <div class="warning"><table border="0" summary="Warning">
11557 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11558 <th align="left">Warning</th>
11560 <tr><td align="left" valign="top"><p>
11561 This constructor is experimental and subject to change in future
11562 versions. There are not too much tests yet, so it is possible that
11563 you can find out some trivial bugs :(
11566 <div class="variablelist">
11567 <p class="title"><b></b></p>
11568 <dl class="variablelist">
11569 <dt><span class="term">Requires:</span></dt>
11572 <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
11578 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers
11579 ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
11580 and unwrapping the inner future (see <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>).
11583 <dt><span class="term">Postconditions:</span></dt>
11585 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11586 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code>
11587 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. The associated
11588 shared state is now unwrapped and the inner future shared state
11589 is associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. <code class="computeroutput"><span class="identifier">other</span></code>
11590 is not associated with any shared state, <code class="computeroutput"><span class="special">!</span>
11591 <span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
11593 <dt><span class="term">Throws:</span></dt>
11597 <dt><span class="term">Notes:</span></dt>
11599 If the compiler does not support rvalue-references, this is implemented
11600 using the boost.thread move emulation.
11605 <div class="section">
11606 <div class="titlepage"><div><div><h6 class="title">
11607 <a name="thread.synchronization.futures.reference.unique_future.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_assignment" title="Move Assignment Operator">Move
11608 Assignment Operator</a>
11609 </h6></div></div></div>
11610 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
11612 <div class="variablelist">
11613 <p class="title"><b></b></p>
11614 <dl class="variablelist">
11615 <dt><span class="term">Effects:</span></dt>
11617 Transfers ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11619 <dt><span class="term">Postconditions:</span></dt>
11621 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11622 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code>
11623 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a
11624 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11625 <code class="computeroutput"><span class="identifier">other</span></code> is not
11626 associated with any shared state. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with an asynchronous
11627 result prior to the call, that result no longer has an associated
11628 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> instance.
11630 <dt><span class="term">Throws:</span></dt>
11634 <dt><span class="term">Notes:</span></dt>
11636 If the compiler does not support rvalue-references, this is implemented
11637 using the boost.thread move emulation.
11642 <div class="section">
11643 <div class="titlepage"><div><div><h6 class="title">
11644 <a name="thread.synchronization.futures.reference.unique_future.swap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.swap" title="Member function swap()">Member
11645 function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a>
11646 </h6></div></div></div>
11647 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">no_except</span><span class="special">;</span>
11649 <div class="variablelist">
11650 <p class="title"><b></b></p>
11651 <dl class="variablelist">
11652 <dt><span class="term">Effects:</span></dt>
11654 Swaps ownership of the shared states associated with <code class="computeroutput"><span class="identifier">other</span></code> and <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11656 <dt><span class="term">Postconditions:</span></dt>
11658 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11659 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code>
11660 returns the value of <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a
11661 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
11662 otherwise <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11663 has no associated result. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with a shared
11664 state, that result is now associated with <code class="computeroutput"><span class="identifier">other</span></code>,
11665 otherwise <code class="computeroutput"><span class="identifier">other</span></code>
11666 has no associated result.
11668 <dt><span class="term">Throws:</span></dt>
11675 <div class="section">
11676 <div class="titlepage"><div><div><h6 class="title">
11677 <a name="thread.synchronization.futures.reference.unique_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()">Member
11678 function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
11679 </h6></div></div></div>
11680 <pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get</span><span class="special">();</span>
11681 <span class="identifier">R</span><span class="special">&</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">();</span>
11682 <span class="keyword">void</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">();</span>
11684 <div class="variablelist">
11685 <p class="title"><b></b></p>
11686 <dl class="variablelist">
11687 <dt><span class="term">Effects:</span></dt>
11689 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11690 is associated with a shared state, waits until the result is
11691 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
11692 and retrieves the result (whether that is a value or an exception).
11694 <dt><span class="term">Returns:</span></dt>
11697 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">()</span></code>
11698 return the stored reference.
11701 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code>,
11702 there is no return value.
11705 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code>
11706 returns an rvalue-reference to the value stored in the shared
11710 <dt><span class="term">Postconditions:</span></dt>
11712 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11713 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11714 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
11716 <dt><span class="term">Throws:</span></dt>
11719 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11720 is not associated with a shared state.
11723 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11724 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11725 of the call, and the current thread is interrupted.
11728 - Any exception stored in the shared state in place of a value.
11731 <dt><span class="term">Notes:</span></dt>
11733 <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
11734 is an <span class="emphasis"><em>interruption point</em></span>.
11739 <div class="section">
11740 <div class="titlepage"><div><div><h6 class="title">
11741 <a name="thread.synchronization.futures.reference.unique_future.get_or"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_or" title="Member function get_or() - EXTENSION">Member
11742 function <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
11744 </h6></div></div></div>
11745 <pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11746 <span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11747 <span class="identifier">R</span><span class="special">&</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11748 <span class="keyword">void</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11750 <div class="warning"><table border="0" summary="Warning">
11752 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11753 <th align="left">Warning</th>
11755 <tr><td align="left" valign="top"><p>
11756 These functions are experimental and subject to change in future
11757 versions. There are not too much tests yet, so it is possible that
11758 you can find out some trivial bugs :(
11761 <div class="variablelist">
11762 <p class="title"><b></b></p>
11763 <dl class="variablelist">
11764 <dt><span class="term">Effects:</span></dt>
11766 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11767 is associated with a shared state, waits until the result is
11768 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
11769 and depending on whether the shared state <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> the retrieves the result.
11771 <dt><span class="term">Returns:</span></dt>
11774 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>
11775 return the stored reference if has_value() and the passes parameter
11779 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">()</span></code>,
11780 there is no return value, but the function doesn't throws even
11781 if the shared state contained an exception.
11784 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>
11785 returns an rvalue-reference to the value stored in the shared
11786 state if <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> and an rvalue-reference build
11787 with the parameter <code class="computeroutput"><span class="identifier">v</span></code>.
11790 <dt><span class="term">Postconditions:</span></dt>
11792 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11793 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11794 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
11796 <dt><span class="term">Throws:</span></dt>
11798 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11799 is not associated with a shared state.
11801 <dt><span class="term">Notes:</span></dt>
11803 <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
11804 is an <span class="emphasis"><em>interruption point</em></span>.
11809 <div class="section">
11810 <div class="titlepage"><div><div><h6 class="title">
11811 <a name="thread.synchronization.futures.reference.unique_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()">Member
11812 function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
11813 </h6></div></div></div>
11814 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
11816 <div class="variablelist">
11817 <p class="title"><b></b></p>
11818 <dl class="variablelist">
11819 <dt><span class="term">Effects:</span></dt>
11821 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11822 is associated with a shared state, waits until the result is
11823 ready. If the result is not ready on entry, and the result has
11824 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
11827 <dt><span class="term">Throws:</span></dt>
11830 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11831 is not associated with a shared state.
11834 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11835 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11836 of the call, and the current thread is interrupted.
11839 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11840 if such a callback is called.
11843 <dt><span class="term">Postconditions:</span></dt>
11845 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11846 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11847 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
11849 <dt><span class="term">Notes:</span></dt>
11851 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
11852 is an <span class="emphasis"><em>interruption point</em></span>.
11857 <div class="section">
11858 <div class="titlepage"><div><div><h6 class="title">
11859 <a name="thread.synchronization.futures.reference.unique_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_duration" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member
11860 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11861 DEPRECATED SINCE V3.0.0</a>
11862 </h6></div></div></div>
11863 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span>
11864 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_duration</span><span class="special">);</span>
11866 <div class="warning"><table border="0" summary="Warning">
11868 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11869 <th align="left">Warning</th>
11871 <tr><td align="left" valign="top">
11873 DEPRECATED since 3.00.
11876 Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template <class Rep, class Period> cv_status wait_for(boost::unique_lock<boost::mutex>& lock, const chrono::duration<Rep, Period>& rel_time)"><code class="computeroutput"><span class="identifier">wait_for</span></code></a>.
11880 <div class="variablelist">
11881 <p class="title"><b></b></p>
11882 <dl class="variablelist">
11883 <dt><span class="term">Effects:</span></dt>
11885 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11886 is associated with a shared state, waits until the result is
11887 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
11888 has elapsed. If the result is not ready on entry, and the result
11889 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
11890 invoked prior to waiting.
11892 <dt><span class="term">Returns:</span></dt>
11894 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11895 is associated with a shared state, and that result is ready before
11896 the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
11899 <dt><span class="term">Throws:</span></dt>
11902 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11903 is not associated with a shared state.
11906 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11907 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11908 of the call, and the current thread is interrupted.
11911 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11912 if such a callback is called.
11915 <dt><span class="term">Postconditions:</span></dt>
11917 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
11918 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11919 returns <code class="computeroutput"><span class="keyword">true</span></code> and
11920 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11921 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
11923 <dt><span class="term">Notes:</span></dt>
11925 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11926 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
11927 meets the Boost.DateTime time duration requirements.
11932 <div class="section">
11933 <div class="titlepage"><div><div><h6 class="title">
11934 <a name="thread.synchronization.futures.reference.unique_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_absolute" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member
11935 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11936 DEPRECATED SINCE V3.0.0</a>
11937 </h6></div></div></div>
11938 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
11940 <div class="warning"><table border="0" summary="Warning">
11942 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11943 <th align="left">Warning</th>
11945 <tr><td align="left" valign="top">
11947 DEPRECATED since 3.00.
11950 Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template <class Clock, class Duration> cv_status wait_until(boost::unique_lock<boost::mutex>& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="identifier">wait_until</span></code></a>.
11954 <div class="variablelist">
11955 <p class="title"><b></b></p>
11956 <dl class="variablelist">
11957 <dt><span class="term">Effects:</span></dt>
11959 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11960 is associated with a shared state, waits until the result is
11961 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
11962 has passed. If the result is not ready on entry, and the result
11963 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
11964 invoked prior to waiting.
11966 <dt><span class="term">Returns:</span></dt>
11968 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11969 is associated with a shared state, and that result is ready before
11970 the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
11973 <dt><span class="term">Throws:</span></dt>
11976 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11977 is not associated with a shared state.
11980 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11981 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11982 of the call, and the current thread is interrupted.
11985 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11986 if such a callback is called.
11989 <dt><span class="term">Postconditions:</span></dt>
11991 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
11992 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11993 returns <code class="computeroutput"><span class="keyword">true</span></code> and
11994 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11995 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
11997 <dt><span class="term">Notes:</span></dt>
11999 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12000 is an <span class="emphasis"><em>interruption point</em></span>.
12005 <div class="section">
12006 <div class="titlepage"><div><div><h6 class="title">
12007 <a name="thread.synchronization.futures.reference.unique_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_for" title="Member function wait_for()">Member
12008 function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
12009 </h6></div></div></div>
12010 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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>
12011 <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12013 <div class="variablelist">
12014 <p class="title"><b></b></p>
12015 <dl class="variablelist">
12016 <dt><span class="term">Effects:</span></dt>
12018 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12019 is associated with a shared state, waits until the result is
12020 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12021 has elapsed. If the result is not ready on entry, and the result
12022 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12023 invoked prior to waiting.
12025 <dt><span class="term">Returns:</span></dt>
12028 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12029 if the shared state contains a deferred function. (Not implemented
12033 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12034 if the shared state is ready.
12037 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12038 if the function is returning because the relative timeout specified
12039 by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
12043 <dt><span class="term">Throws:</span></dt>
12046 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12047 is not associated with a shared state.
12050 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12051 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12052 of the call, and the current thread is interrupted.
12055 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12056 if such a callback is called.
12059 <dt><span class="term">Postconditions:</span></dt>
12061 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12062 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12063 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12064 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12065 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12067 <dt><span class="term">Notes:</span></dt>
12069 <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
12070 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12071 meets the Boost.DateTime time duration requirements.
12076 <div class="section">
12077 <div class="titlepage"><div><div><h6 class="title">
12078 <a name="thread.synchronization.futures.reference.unique_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_until" title="Member function wait_until()">Member
12079 function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
12080 </h6></div></div></div>
12081 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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>
12082 <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12084 <div class="variablelist">
12085 <p class="title"><b></b></p>
12086 <dl class="variablelist">
12087 <dt><span class="term">Effects:</span></dt>
12089 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12090 is associated with a shared state, waits until the result is
12091 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12092 has passed. If the result is not ready on entry, and the result
12093 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12094 invoked prior to waiting.
12096 <dt><span class="term">Returns:</span></dt>
12099 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12100 if the shared state contains a deferred function. (Not implemented
12104 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12105 if the shared state is ready.
12108 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12109 if the function is returning because the absolute timeout specified
12110 by <code class="computeroutput"><span class="identifier">absl_time</span></code>
12114 <dt><span class="term">Throws:</span></dt>
12117 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12118 is not associated with a shared state.
12121 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12122 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12123 of the call, and the current thread is interrupted.
12126 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12127 if such a callback is called.
12130 <dt><span class="term">Postconditions:</span></dt>
12132 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12133 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12134 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12135 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12136 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12138 <dt><span class="term">Notes:</span></dt>
12140 <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
12141 is an <span class="emphasis"><em>interruption point</em></span>.
12146 <div class="section">
12147 <div class="titlepage"><div><div><h6 class="title">
12148 <a name="thread.synchronization.futures.reference.unique_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.valid" title="Member function valid()">Member
12149 function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
12150 </h6></div></div></div>
12151 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
12153 <div class="variablelist">
12154 <p class="title"><b></b></p>
12155 <dl class="variablelist">
12156 <dt><span class="term">Returns:</span></dt>
12158 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12159 is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
12162 <dt><span class="term">Remarks:</span></dt>
12164 The result of this function is not stable and that the future
12165 could become invalid even if the function returned true or vice-versa.
12167 <dt><span class="term">Throws:</span></dt>
12174 <div class="section">
12175 <div class="titlepage"><div><div><h6 class="title">
12176 <a name="thread.synchronization.futures.reference.unique_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION">Member
12177 function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
12179 </h6></div></div></div>
12180 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12182 <div class="variablelist">
12183 <p class="title"><b></b></p>
12184 <dl class="variablelist">
12185 <dt><span class="term">Returns:</span></dt>
12187 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12188 is associated with a shared state and that result is ready for
12189 retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
12192 <dt><span class="term">Remarks:</span></dt>
12194 The result of this function is not stable and that the future
12195 could become not ready even if the function returned true or
12198 <dt><span class="term">Throws:</span></dt>
12205 <div class="section">
12206 <div class="titlepage"><div><div><h6 class="title">
12207 <a name="thread.synchronization.futures.reference.unique_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION">Member
12208 function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
12210 </h6></div></div></div>
12211 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12213 <div class="variablelist">
12214 <p class="title"><b></b></p>
12215 <dl class="variablelist">
12216 <dt><span class="term">Returns:</span></dt>
12218 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12219 is associated with a shared state, that result is ready for retrieval,
12220 and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
12223 <dt><span class="term">Remarks:</span></dt>
12225 The result of this function is not stable and the future could
12226 lost its value even if the function returned true or vice-versa.
12228 <dt><span class="term">Throws:</span></dt>
12235 <div class="section">
12236 <div class="titlepage"><div><div><h6 class="title">
12237 <a name="thread.synchronization.futures.reference.unique_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION">Member
12238 function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
12239 </h6></div></div></div>
12240 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12242 <div class="variablelist">
12243 <p class="title"><b></b></p>
12244 <dl class="variablelist">
12245 <dt><span class="term">Returns:</span></dt>
12247 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12248 is associated with a shared state, that result is ready for retrieval,
12249 and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
12252 <dt><span class="term">Remarks:</span></dt>
12254 The result of this function is not stable and the future could
12255 lost its exception even if the function returned true or vice-versa.
12257 <dt><span class="term">Throws:</span></dt>
12264 <div class="section">
12265 <div class="titlepage"><div><div><h6 class="title">
12266 <a name="thread.synchronization.futures.reference.unique_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member
12267 function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
12268 </h6></div></div></div>
12269 <pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
12271 <div class="variablelist">
12272 <p class="title"><b></b></p>
12273 <dl class="variablelist">
12274 <dt><span class="term">Effects:</span></dt>
12276 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12277 is associated with a shared state, waits until the result is
12278 ready. If the result is not ready on entry, and the result has
12279 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
12282 <dt><span class="term">Returns:</span></dt>
12284 a exception_ptr, storring or not an exception.
12286 <dt><span class="term">Remarks:</span></dt>
12288 The result of this function is not stable and the future could
12289 lost its exception even if the function returned a valid <code class="computeroutput"><span class="identifier">exception_ptr</span></code> or vice-versa.
12291 <dt><span class="term">Throws:</span></dt>
12293 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
12298 <div class="section">
12299 <div class="titlepage"><div><div><h6 class="title">
12300 <a name="thread.synchronization.futures.reference.unique_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION">Member
12301 function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
12303 </h6></div></div></div>
12304 <pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span>
12306 <div class="variablelist">
12307 <p class="title"><b></b></p>
12308 <dl class="variablelist">
12309 <dt><span class="term">Effects:</span></dt>
12311 Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
12314 <dt><span class="term">Returns:</span></dt>
12316 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12317 is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared
12318 state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
12319 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise.
12321 <dt><span class="term">Remarks:</span></dt>
12323 The result of this function is not stable.
12325 <dt><span class="term">Throws:</span></dt>
12332 <div class="section">
12333 <div class="titlepage"><div><div><h6 class="title">
12334 <a name="thread.synchronization.futures.reference.unique_future.share"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.share" title="Member function share()">Member
12335 function <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code></a>
12336 </h6></div></div></div>
12337 <pre class="programlisting"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">share</span><span class="special">();</span>
12339 <div class="variablelist">
12340 <p class="title"><b></b></p>
12341 <dl class="variablelist">
12342 <dt><span class="term">Returns:</span></dt>
12344 <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span></code>.
12346 <dt><span class="term">Postconditions:</span></dt>
12348 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">valid</span><span class="special">()</span>
12349 <span class="special">==</span> <span class="keyword">false</span></code>.
12354 <div class="section">
12355 <div class="titlepage"><div><div><h6 class="title">
12356 <a name="thread.synchronization.futures.reference.unique_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.then" title="Member function then() - EXTENSION">Member
12357 function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
12359 </h6></div></div></div>
12360 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12361 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12362 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12363 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12364 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12365 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12366 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12367 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12368 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12370 <div class="warning"><table border="0" summary="Warning">
12372 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12373 <th align="left">Warning</th>
12375 <tr><td align="left" valign="top"><p>
12376 These functions are experimental and subject to change in future
12377 versions. There are not too much tests yet, so it is possible that
12378 you can find out some trivial bugs :(
12381 <div class="note"><table border="0" summary="Note">
12383 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
12384 <th align="left">Note</th>
12386 <tr><td align="left" valign="top"><p>
12387 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related
12388 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
12389 H. Sutter, S. Mithani.
12392 <div class="variablelist">
12393 <p class="title"><b></b></p>
12394 <dl class="variablelist">
12395 <dt><span class="term">Notes:</span></dt>
12397 The three functions differ only by input parameters. The first
12398 only takes a callable object which accepts a future object as
12399 a parameter. The second function takes a scheduler as the first
12400 parameter and a callable object as the second parameter. The
12401 third function takes a launch policy as the first parameter and
12402 a callable object as the second parameter.
12404 <dt><span class="term">Effects:</span></dt>
12407 All the functions create a shared state that is associated with
12408 the returned future object. The further behavior of the functions
12412 - The continuation is called when the object's shared state is
12413 ready (has a value or exception stored).
12416 - The continuation launches according to the specified policy
12420 - When the scheduler or launch policy is not provided the continuation
12421 inherits the parent's launch policy or scheduler.
12424 - Any value returned from the continuation is stored as the result
12425 in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>.
12426 Any exception propagated from the execution of the continuation
12427 is stored as the exceptional result in the shared state of the
12428 resulting <code class="computeroutput"><span class="identifier">future</span></code>.
12431 - If the parent was created with <code class="computeroutput"><span class="identifier">promise</span><span class="special"><></span></code> or with a <code class="computeroutput"><span class="identifier">packaged_task</span><span class="special"><></span></code>
12432 (has no associated launch policy), the continuation behaves the
12433 same as the third overload with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> <span class="special">|</span>
12434 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> and the same argument
12435 for <code class="computeroutput"><span class="identifier">func</span></code>.
12438 - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
12439 and the continuation does not have a specified launch policy
12440 or scheduler, then the parent is filled by immediately calling
12441 <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
12442 is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>.
12445 <dt><span class="term">Returns:</span></dt>
12447 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)></span></code>
12448 that refers to the shared state created by the continuation.
12450 <dt><span class="term">Notes:</span></dt>
12453 - Note that nested futures are not implicitly unwrapped yet.
12454 This could be subject to change in future versions.
12457 - The returned futures behave as the ones returned from boost::async,
12458 the destructor of the future object returned from then will block.
12459 This could be subject to change in future versions.
12462 <dt><span class="term">Postconditions:</span></dt>
12465 - The <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code> object
12466 passed to the parameter of the continuation function is a copy
12467 of the original <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code>.
12470 - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
12471 <span class="special">==</span> <span class="keyword">false</span></code>
12472 on original future; <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
12473 <span class="keyword">true</span></code> on the <code class="computeroutput"><span class="identifier">future</span></code> returned from then.
12479 <div class="section">
12480 <div class="titlepage"><div><div><h6 class="title">
12481 <a name="thread.synchronization.futures.reference.unique_future.unwrap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap" title="Member function unwrap() EXTENSION">Member
12482 function <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>
12484 </h6></div></div></div>
12485 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">></span>
12486 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">></span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">>>::</span><span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
12487 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">></span>
12488 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">></span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">>>::</span><span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
12490 <div class="warning"><table border="0" summary="Warning">
12492 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12493 <th align="left">Warning</th>
12495 <tr><td align="left" valign="top"><p>
12496 These functions are experimental and subject to change in future
12497 versions. There are not too much tests yet, so it is possible that
12498 you can find out some trivial bugs :(
12501 <div class="note"><table border="0" summary="Note">
12503 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
12504 <th align="left">Note</th>
12506 <tr><td align="left" valign="top"><p>
12507 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related
12508 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
12509 H. Sutter, S. Mithani.
12512 <div class="variablelist">
12513 <p class="title"><b></b></p>
12514 <dl class="variablelist">
12515 <dt><span class="term">Notes:</span></dt>
12517 Removes the outermost future and returns a future with the associated
12518 state been a proxy of the outer future.
12520 <dt><span class="term">Effects:</span></dt>
12522 - Returns a future that becomes ready when the shared state of
12523 the outer and inner future is ready. The validity of the future
12524 returned from <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> applied on the outer future
12525 cannot be established a priori. If it is not valid, this future
12526 is forced to be valid and becomes ready with an exception of
12527 type <code class="computeroutput"><span class="identifier">future_error</span></code>,
12528 with an error code of <code class="computeroutput"><span class="identifier">future_errc</span><span class="special">::</span><span class="identifier">broken_promise</span></code>.
12530 <dt><span class="term">Returns:</span></dt>
12532 An object of type future with the associated state been a proxy
12535 <dt><span class="term">Postconditions:</span></dt>
12537 - The returned future has <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
12538 <span class="keyword">true</span></code>.
12544 <div class="section">
12545 <div class="titlepage"><div><div><h5 class="title">
12546 <a name="thread.synchronization.futures.reference.shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a>
12547 </h5></div></div></div>
12548 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
12549 <span class="keyword">class</span> <span class="identifier">shared_future</span>
12550 <span class="special">{</span>
12551 <span class="keyword">public</span><span class="special">:</span>
12552 <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12553 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12555 <span class="identifier">shared_future</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
12556 <span class="special">~</span><span class="identifier">shared_future</span><span class="special">();</span>
12558 <span class="comment">// copy support</span>
12559 <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
12560 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
12562 <span class="comment">// move support</span>
12563 <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12564 <span class="identifier">shared_future</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12565 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12566 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12568 <span class="comment">// factories</span>
12569 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12570 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12571 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12572 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12573 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12574 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12575 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
12576 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
12577 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12579 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span>
12581 <span class="comment">// retrieving the value</span>
12582 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span>
12584 <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
12586 <span class="comment">// functions to check state, and wait for ready</span>
12587 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
12588 <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12589 <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12590 <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12592 <span class="comment">// waiting for the result to be ready</span>
12593 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12594 <span class="keyword">template</span> <span class="special"><</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>
12595 <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12596 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span>
12597 <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12599 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
12600 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span>
12601 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span>
12602 <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span>
12603 <span class="preprocessor">#endif</span>
12604 <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12606 <span class="special">};</span>
12608 <div class="section">
12609 <div class="titlepage"><div><div><h6 class="title">
12610 <a name="thread.synchronization.futures.reference.shared_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.default_constructor" title="Default Constructor">Default
12612 </h6></div></div></div>
12613 <pre class="programlisting"><span class="identifier">shared_future</span><span class="special">();</span>
12615 <div class="variablelist">
12616 <p class="title"><b></b></p>
12617 <dl class="variablelist">
12618 <dt><span class="term">Effects:</span></dt>
12620 Constructs an uninitialized shared_future.
12622 <dt><span class="term">Postconditions:</span></dt>
12624 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span></code></a> returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12625 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>.
12627 <dt><span class="term">Throws:</span></dt>
12634 <div class="section">
12635 <div class="titlepage"><div><div><h6 class="title">
12636 <a name="thread.synchronization.futures.reference.shared_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()">Member
12637 function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
12638 </h6></div></div></div>
12639 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">get</span><span class="special">();</span>
12640 <span class="identifier">R</span><span class="special">&</span> <span class="identifier">get</span><span class="special">();</span>
12641 <span class="keyword">void</span> <span class="identifier">get</span><span class="special">();</span>
12643 <div class="variablelist">
12644 <p class="title"><b></b></p>
12645 <dl class="variablelist">
12646 <dt><span class="term">Effects:</span></dt>
12648 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12649 is associated with a shared state, waits until the result is
12650 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
12651 and returns a <code class="computeroutput"><span class="keyword">const</span></code>
12652 reference to the result.
12654 <dt><span class="term">Returns:</span></dt>
12657 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">()</span></code> return the stored reference.
12660 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code>, there is no return value.
12663 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code> returns a <code class="computeroutput"><span class="keyword">const</span></code>
12664 reference to the value stored in the shared state.
12667 <dt><span class="term">Throws:</span></dt>
12670 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12671 is not associated with a shared state.
12674 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12675 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12676 of the call, and the current thread is interrupted.
12679 <dt><span class="term">Notes:</span></dt>
12681 <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
12682 is an <span class="emphasis"><em>interruption point</em></span>.
12687 <div class="section">
12688 <div class="titlepage"><div><div><h6 class="title">
12689 <a name="thread.synchronization.futures.reference.shared_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()">Member
12690 function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
12691 </h6></div></div></div>
12692 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12694 <div class="variablelist">
12695 <p class="title"><b></b></p>
12696 <dl class="variablelist">
12697 <dt><span class="term">Effects:</span></dt>
12699 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12700 is associated with a shared state, waits until the result is
12701 ready. If the result is not ready on entry, and the result has
12702 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
12705 <dt><span class="term">Throws:</span></dt>
12708 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12709 is not associated with a shared state.
12712 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12713 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12714 of the call, and the current thread is interrupted.
12717 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12718 if such a callback is called.
12721 <dt><span class="term">Postconditions:</span></dt>
12723 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12724 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12725 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12727 <dt><span class="term">Notes:</span></dt>
12729 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
12730 is an <span class="emphasis"><em>interruption point</em></span>.
12735 <div class="section">
12736 <div class="titlepage"><div><div><h6 class="title">
12737 <a name="thread.synchronization.futures.reference.shared_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_duration" title="Member function timed_wait()">Member
12738 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
12739 </h6></div></div></div>
12740 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span>
12741 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_duration</span><span class="special">);</span>
12743 <div class="variablelist">
12744 <p class="title"><b></b></p>
12745 <dl class="variablelist">
12746 <dt><span class="term">Effects:</span></dt>
12748 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12749 is associated with a shared state, waits until the result is
12750 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12751 has elapsed. If the result is not ready on entry, and the result
12752 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12753 invoked prior to waiting.
12755 <dt><span class="term">Returns:</span></dt>
12757 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12758 is associated with a shared state, and that result is ready before
12759 the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
12762 <dt><span class="term">Throws:</span></dt>
12765 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12766 is not associated with a shared state.
12769 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12770 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12771 of the call, and the current thread is interrupted.
12774 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12775 if such a callback is called.
12778 <dt><span class="term">Postconditions:</span></dt>
12780 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12781 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12782 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12783 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12784 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12786 <dt><span class="term">Notes:</span></dt>
12788 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12789 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12790 meets the Boost.DateTime time duration requirements.
12795 <div class="section">
12796 <div class="titlepage"><div><div><h6 class="title">
12797 <a name="thread.synchronization.futures.reference.shared_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_absolute" title="Member function timed_wait()">Member
12798 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
12799 </h6></div></div></div>
12800 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
12802 <div class="variablelist">
12803 <p class="title"><b></b></p>
12804 <dl class="variablelist">
12805 <dt><span class="term">Effects:</span></dt>
12807 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12808 is associated with a shared state, waits until the result is
12809 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12810 has passed. If the result is not ready on entry, and the result
12811 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12812 invoked prior to waiting.
12814 <dt><span class="term">Returns:</span></dt>
12816 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12817 is associated with a shared state, and that result is ready before
12818 the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
12821 <dt><span class="term">Throws:</span></dt>
12824 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12825 is not associated with a shared state.
12828 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12829 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12830 of the call, and the current thread is interrupted.
12833 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12834 if such a callback is called.
12837 <dt><span class="term">Postconditions:</span></dt>
12839 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12840 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12841 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12842 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12843 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12845 <dt><span class="term">Notes:</span></dt>
12847 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12848 is an <span class="emphasis"><em>interruption point</em></span>.
12853 <div class="section">
12854 <div class="titlepage"><div><div><h6 class="title">
12855 <a name="thread.synchronization.futures.reference.shared_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_for" title="Member function wait_for()">Member
12856 function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
12857 </h6></div></div></div>
12858 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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>
12859 <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12861 <div class="variablelist">
12862 <p class="title"><b></b></p>
12863 <dl class="variablelist">
12864 <dt><span class="term">Effects:</span></dt>
12866 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12867 is associated with a shared state, waits until the result is
12868 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12869 has elapsed. If the result is not ready on entry, and the result
12870 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12871 invoked prior to waiting.
12873 <dt><span class="term">Returns:</span></dt>
12876 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12877 if the shared state contains a deferred function. (Not implemented
12881 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12882 if the shared state is ready.
12885 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12886 if the function is returning because the relative timeout specified
12887 by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
12891 <dt><span class="term">Throws:</span></dt>
12894 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12895 is not associated with a shared state.
12898 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12899 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12900 of the call, and the current thread is interrupted.
12903 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12904 if such a callback is called.
12907 <dt><span class="term">Postconditions:</span></dt>
12909 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12910 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12911 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12912 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12913 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12915 <dt><span class="term">Notes:</span></dt>
12917 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12918 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12919 meets the Boost.DateTime time duration requirements.
12924 <div class="section">
12925 <div class="titlepage"><div><div><h6 class="title">
12926 <a name="thread.synchronization.futures.reference.shared_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_until" title="Member function wait_until()">Member
12927 function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
12928 </h6></div></div></div>
12929 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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>
12930 <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12932 <div class="variablelist">
12933 <p class="title"><b></b></p>
12934 <dl class="variablelist">
12935 <dt><span class="term">Effects:</span></dt>
12937 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12938 is associated with a shared state, waits until the result is
12939 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12940 has passed. If the result is not ready on entry, and the result
12941 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12942 invoked prior to waiting.
12944 <dt><span class="term">Returns:</span></dt>
12947 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12948 if the shared state contains a deferred function. (Not implemented
12952 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12953 if the shared state is ready.
12956 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12957 if the function is returning because the absolute timeout specified
12958 by <code class="computeroutput"><span class="identifier">absl_time</span></code>
12962 <dt><span class="term">Throws:</span></dt>
12965 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12966 is not associated with a shared state.
12969 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12970 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12971 of the call, and the current thread is interrupted.
12974 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12975 if such a callback is called.
12978 <dt><span class="term">Postconditions:</span></dt>
12980 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12981 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12982 returns <code class="computeroutput"><span class="keyword">true</span></code> and
12983 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12984 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12986 <dt><span class="term">Notes:</span></dt>
12988 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12989 is an <span class="emphasis"><em>interruption point</em></span>.
12994 <div class="section">
12995 <div class="titlepage"><div><div><h6 class="title">
12996 <a name="thread.synchronization.futures.reference.shared_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.valid" title="Member function valid()">Member
12997 function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
12998 </h6></div></div></div>
12999 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
13001 <div class="variablelist">
13002 <p class="title"><b></b></p>
13003 <dl class="variablelist">
13004 <dt><span class="term">Returns:</span></dt>
13006 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13007 is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
13010 <dt><span class="term">Throws:</span></dt>
13017 <div class="section">
13018 <div class="titlepage"><div><div><h6 class="title">
13019 <a name="thread.synchronization.futures.reference.shared_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION">Member
13020 function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
13022 </h6></div></div></div>
13023 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13025 <div class="variablelist">
13026 <p class="title"><b></b></p>
13027 <dl class="variablelist">
13028 <dt><span class="term">Returns:</span></dt>
13030 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13031 is associated with a shared state, and that result is ready for
13032 retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
13035 <dt><span class="term">Throws:</span></dt>
13037 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13042 <div class="section">
13043 <div class="titlepage"><div><div><h6 class="title">
13044 <a name="thread.synchronization.futures.reference.shared_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION">Member
13045 function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
13047 </h6></div></div></div>
13048 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13050 <div class="variablelist">
13051 <p class="title"><b></b></p>
13052 <dl class="variablelist">
13053 <dt><span class="term">Returns:</span></dt>
13055 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13056 is associated with a shared state, that result is ready for retrieval,
13057 and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
13060 <dt><span class="term">Throws:</span></dt>
13062 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13067 <div class="section">
13068 <div class="titlepage"><div><div><h6 class="title">
13069 <a name="thread.synchronization.futures.reference.shared_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION">Member
13070 function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
13071 </h6></div></div></div>
13072 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13074 <div class="variablelist">
13075 <p class="title"><b></b></p>
13076 <dl class="variablelist">
13077 <dt><span class="term">Returns:</span></dt>
13079 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13080 is associated with a shared state, that result is ready for retrieval,
13081 and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
13084 <dt><span class="term">Throws:</span></dt>
13086 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13091 <div class="section">
13092 <div class="titlepage"><div><div><h6 class="title">
13093 <a name="thread.synchronization.futures.reference.shared_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member
13094 function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
13095 </h6></div></div></div>
13096 <pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
13098 <div class="variablelist">
13099 <p class="title"><b></b></p>
13100 <dl class="variablelist">
13101 <dt><span class="term">Effects:</span></dt>
13103 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13104 is associated with a shared state, waits until the result is
13105 ready. If the result is not ready on entry, and the result has
13106 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
13109 <dt><span class="term">Returns:</span></dt>
13111 a exception_ptr, storring or not an exception.
13113 <dt><span class="term">Throws:</span></dt>
13115 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13120 <div class="section">
13121 <div class="titlepage"><div><div><h6 class="title">
13122 <a name="thread.synchronization.futures.reference.shared_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION">Member
13123 function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
13125 </h6></div></div></div>
13126 <pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span>
13128 <div class="variablelist">
13129 <p class="title"><b></b></p>
13130 <dl class="variablelist">
13131 <dt><span class="term">Effects:</span></dt>
13133 Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13136 <dt><span class="term">Returns:</span></dt>
13138 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13139 is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared
13140 state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
13141 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise.
13143 <dt><span class="term">Throws:</span></dt>
13145 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13150 <div class="section">
13151 <div class="titlepage"><div><div><h6 class="title">
13152 <a name="thread.synchronization.futures.reference.shared_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.then" title="Member function then() EXTENSION">Member
13153 function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
13155 </h6></div></div></div>
13156 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13157 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
13158 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13159 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13160 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
13161 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13162 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13163 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span>
13164 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13166 <div class="warning"><table border="0" summary="Warning">
13168 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
13169 <th align="left">Warning</th>
13171 <tr><td align="left" valign="top"><p>
13172 These functions are experimental and subject to change in future
13173 versions. There are not too much tests yet, so it is possible that
13174 you can find out some trivial bugs :(
13177 <div class="note"><table border="0" summary="Note">
13179 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
13180 <th align="left">Note</th>
13182 <tr><td align="left" valign="top"><p>
13183 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related
13184 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
13185 H. Sutter, S. Mithani.
13188 <div class="variablelist">
13189 <p class="title"><b></b></p>
13190 <dl class="variablelist">
13191 <dt><span class="term">Notes:</span></dt>
13193 The three functions differ only by input parameters. The first
13194 only takes a callable object which accepts a shared_future object
13195 as a parameter. The second function takes a scheduler as the
13196 first parameter and a callable object as the second parameter.
13197 The third function takes a launch policy as the first parameter
13198 and a callable object as the second parameter.
13200 <dt><span class="term">Effects:</span></dt>
13203 - The continuation is called when the object's shared state is
13204 ready (has a value or exception stored).
13207 - The continuation launches according to the specified policy
13211 - When the scheduler or launch policy is not provided the continuation
13212 inherits the parent's launch policy or scheduler.
13215 - If the parent was created with <code class="computeroutput"><span class="identifier">promise</span></code>
13216 or with a <code class="computeroutput"><span class="identifier">packaged_task</span></code>
13217 (has no associated launch policy), the continuation behaves the
13218 same as the third overload with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> <span class="special">|</span>
13219 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> and the same argument
13223 - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
13224 and the continuation does not have a specified launch policy
13225 or scheduler, then the parent is filled by immediately calling
13226 <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
13227 is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
13230 <dt><span class="term">Returns:</span></dt>
13232 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)></span></code> that refers to the shared
13233 state created by the continuation.
13235 <dt><span class="term">Notes:</span></dt>
13238 - Note that nested futures are not implicitly unwrapped yet.
13239 This could be subject to change in future versions.
13242 - The returned futures behave as the ones returned from boost::async,
13243 the destructor of the future object returned from then will block.
13244 This could be subject to change in future versions.
13247 <dt><span class="term">Postconditions:</span></dt>
13250 - The future object is moved to the parameter of the continuation
13254 - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
13255 <span class="special">==</span> <span class="keyword">true</span></code>
13256 on original <code class="computeroutput"><span class="identifier">shared_future</span></code>;
13257 <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
13258 <span class="special">==</span> <span class="keyword">true</span></code>
13259 on the <code class="computeroutput"><span class="identifier">future</span></code>
13260 returned from then.
13267 <div class="section">
13268 <div class="titlepage"><div><div><h5 class="title">
13269 <a name="thread.synchronization.futures.reference.promise"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a>
13270 </h5></div></div></div>
13271 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
13272 <span class="keyword">class</span> <span class="identifier">promise</span>
13273 <span class="special">{</span>
13274 <span class="keyword">public</span><span class="special">:</span>
13275 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13277 <span class="identifier">promise</span><span class="special">();</span>
13278 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13279 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span>
13280 <span class="identifier">promise</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13281 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13282 <span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
13284 <span class="comment">// Move support</span>
13285 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span>
13286 <span class="identifier">promise</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span>
13288 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13289 <span class="comment">// Result retrieval</span>
13290 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span>
13292 <span class="comment">// Set the value</span>
13293 <span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>
13294 <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
13295 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
13296 <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13298 <span class="comment">// setting the result with deferred notification</span>
13299 <span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>
13300 <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">p</span><span class="special">);</span>
13301 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
13302 <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13304 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13305 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13306 <span class="special">};</span>
13308 <div class="section">
13309 <div class="titlepage"><div><div><h6 class="title">
13310 <a name="thread.synchronization.futures.reference.promise.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.default_constructor" title="Default Constructor">Default
13312 </h6></div></div></div>
13313 <pre class="programlisting"><span class="identifier">promise</span><span class="special">();</span>
13315 <div class="variablelist">
13316 <p class="title"><b></b></p>
13317 <dl class="variablelist">
13318 <dt><span class="term">Effects:</span></dt>
13320 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated
13323 <dt><span class="term">Throws:</span></dt>
13330 <div class="section">
13331 <div class="titlepage"><div><div><h6 class="title">
13332 <a name="thread.synchronization.futures.reference.promise.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.alloc_constructor" title="Allocator Constructor">Allocator
13334 </h6></div></div></div>
13335 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13336 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span>
13338 <div class="variablelist">
13339 <p class="title"><b></b></p>
13340 <dl class="variablelist">
13341 <dt><span class="term">Effects:</span></dt>
13343 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated
13344 result using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
13346 <dt><span class="term">Throws:</span></dt>
13350 <dt><span class="term">Notes:</span></dt>
13352 Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
13357 <div class="section">
13358 <div class="titlepage"><div><div><h6 class="title">
13359 <a name="thread.synchronization.futures.reference.promise.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_constructor" title="Move Constructor">Move
13361 </h6></div></div></div>
13362 <pre class="programlisting"><span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
13364 <div class="variablelist">
13365 <p class="title"><b></b></p>
13366 <dl class="variablelist">
13367 <dt><span class="term">Effects:</span></dt>
13369 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a>, and transfers
13370 ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code>
13371 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13372 leaving <code class="computeroutput"><span class="identifier">other</span></code>
13373 with no associated result.
13375 <dt><span class="term">Throws:</span></dt>
13379 <dt><span class="term">Notes:</span></dt>
13381 If the compiler does not support rvalue-references, this is implemented
13382 using the boost.thread move emulation.
13387 <div class="section">
13388 <div class="titlepage"><div><div><h6 class="title">
13389 <a name="thread.synchronization.futures.reference.promise.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_assignment" title="Move Assignment Operator">Move
13390 Assignment Operator</a>
13391 </h6></div></div></div>
13392 <pre class="programlisting"><span class="identifier">promise</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
13394 <div class="variablelist">
13395 <p class="title"><b></b></p>
13396 <dl class="variablelist">
13397 <dt><span class="term">Effects:</span></dt>
13399 Transfers ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code>
13400 with no associated result. If there was already a result associated
13401 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13402 and that result was not <span class="emphasis"><em>ready</em></span>, sets any
13403 futures associated with that result to <span class="emphasis"><em>ready</em></span>
13404 with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
13405 exception as the result.
13407 <dt><span class="term">Throws:</span></dt>
13411 <dt><span class="term">Notes:</span></dt>
13413 If the compiler does not support rvalue-references, this is implemented
13414 using the boost.thread move emulation.
13419 <div class="section">
13420 <div class="titlepage"><div><div><h6 class="title">
13421 <a name="thread.synchronization.futures.reference.promise.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.destructor" title="Destructor">Destructor</a>
13422 </h6></div></div></div>
13423 <pre class="programlisting"><span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
13425 <div class="variablelist">
13426 <p class="title"><b></b></p>
13427 <dl class="variablelist">
13428 <dt><span class="term">Effects:</span></dt>
13430 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13431 If there was a result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that result is not
13432 <span class="emphasis"><em>ready</em></span>, sets any futures associated with
13433 that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as
13436 <dt><span class="term">Throws:</span></dt>
13443 <div class="section">
13444 <div class="titlepage"><div><div><h6 class="title">
13445 <a name="thread.synchronization.futures.reference.promise.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.get_future" title="Member Function get_future()">Member
13446 Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
13447 </h6></div></div></div>
13448 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span>
13450 <div class="variablelist">
13451 <p class="title"><b></b></p>
13452 <dl class="variablelist">
13453 <dt><span class="term">Effects:</span></dt>
13455 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13456 was not associated with a result, allocate storage for a new
13457 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with
13458 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13460 <dt><span class="term">Throws:</span></dt>
13462 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if
13463 the future associated with the task has already been retrieved.
13464 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if any memory necessary
13465 could not be allocated.
13470 <div class="section">
13471 <div class="titlepage"><div><div><h6 class="title">
13472 <a name="thread.synchronization.futures.reference.promise.set_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value" title="Member Function set_value()">Member
13473 Function <code class="computeroutput"><span class="identifier">set_value</span><span class="special">()</span></code></a>
13474 </h6></div></div></div>
13475 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">r</span><span class="special">);</span>
13476 <span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span>
13477 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span>
13478 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">set_value</span><span class="special">();</span>
13480 <div class="variablelist">
13481 <p class="title"><b></b></p>
13482 <dl class="variablelist">
13483 <dt><span class="term">Effects:</span></dt>
13486 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13487 was not associated with a result, allocate storage for a new
13488 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13491 - Store the value <code class="computeroutput"><span class="identifier">r</span></code>
13492 in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
13493 for the asynchronous result are woken.
13496 <dt><span class="term">Postconditions:</span></dt>
13498 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13499 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
13500 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
13501 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13503 <dt><span class="term">Throws:</span></dt>
13506 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13507 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
13510 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13511 has no shared state.
13514 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13515 for storage of the result cannot be allocated.
13518 - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
13524 <div class="section">
13525 <div class="titlepage"><div><div><h6 class="title">
13526 <a name="thread.synchronization.futures.reference.promise.set_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception" title="Member Function set_exception()">Member
13527 Function <code class="computeroutput"><span class="identifier">set_exception</span><span class="special">()</span></code></a>
13528 </h6></div></div></div>
13529 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
13530 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
13531 <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13533 <div class="variablelist">
13534 <p class="title"><b></b></p>
13535 <dl class="variablelist">
13536 <dt><span class="term">Effects:</span></dt>
13539 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13540 was not associated with a result, allocate storage for a new
13541 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13544 - Store the exception <code class="computeroutput"><span class="identifier">e</span></code>
13545 in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
13546 for the asynchronous result are woken.
13549 <dt><span class="term">Postconditions:</span></dt>
13551 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13552 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13553 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13554 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13556 <dt><span class="term">Throws:</span></dt>
13559 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13560 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
13563 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13564 has no shared state.
13567 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13568 for storage of the result cannot be allocated.
13574 <div class="section">
13575 <div class="titlepage"><div><div><h6 class="title">
13576 <a name="thread.synchronization.futures.reference.promise.set_value_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value_at_thread_exit" title="Member Function set_value_at_thread_exit()">Member
13577 Function <code class="computeroutput"><span class="identifier">set_value_at_thread_exit</span><span class="special">()</span></code></a>
13578 </h6></div></div></div>
13579 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">r</span><span class="special">);</span>
13580 <span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span>
13581 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span>
13582 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">();</span>
13584 <div class="variablelist">
13585 <p class="title"><b></b></p>
13586 <dl class="variablelist">
13587 <dt><span class="term">Effects:</span></dt>
13589 Stores the value r in the shared state without making that state
13590 ready immediately. Schedules that state to be made ready when
13591 the current thread exits, after all objects of thread storage
13592 duration associated with the current thread have been destroyed.
13594 <dt><span class="term">Throws:</span></dt>
13597 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13598 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
13601 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13602 has no shared state.
13605 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13606 for storage of the result cannot be allocated.
13609 - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
13615 <div class="section">
13616 <div class="titlepage"><div><div><h6 class="title">
13617 <a name="thread.synchronization.futures.reference.promise.set_exception_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception_at_thread_exit" title="Member Function set_exception_at_thread_exit()">Member
13618 Function <code class="computeroutput"><span class="identifier">set_exception_at_thread_exit</span><span class="special">()</span></code></a>
13619 </h6></div></div></div>
13620 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
13621 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
13622 <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13624 <div class="variablelist">
13625 <p class="title"><b></b></p>
13626 <dl class="variablelist">
13627 <dt><span class="term">Effects:</span></dt>
13629 Stores the exception pointer p in the shared state without making
13630 that state ready immediately. Schedules that state to be made
13631 ready when the current thread exits, after all objects of thread
13632 storage duration associated with the current thread have been
13635 <dt><span class="term">Postconditions:</span></dt>
13637 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13638 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13639 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13640 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13642 <dt><span class="term">Throws:</span></dt>
13645 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13646 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
13649 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13650 has no shared state.
13653 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13654 for storage of the result cannot be allocated.
13660 <div class="section">
13661 <div class="titlepage"><div><div><h6 class="title">
13662 <a name="thread.synchronization.futures.reference.promise.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member
13663 Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
13664 </h6></div></div></div>
13665 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13666 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
13668 <div class="variablelist">
13669 <p class="title"><b></b></p>
13670 <dl class="variablelist">
13671 <dt><span class="term">Preconditions:</span></dt>
13673 The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code>
13674 is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> shall be well-formed.
13675 Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
13676 shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
13678 <dt><span class="term">Effects:</span></dt>
13680 Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
13681 with the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>.
13682 This will replace any existing wait callback store alongside
13683 that result. If a thread subsequently calls one of the wait functions
13684 on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated
13685 with this result, and the result is not <span class="emphasis"><em>ready</em></span>,
13686 <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
13689 <dt><span class="term">Throws:</span></dt>
13691 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory cannot
13692 be allocated for the required storage.
13698 <div class="section">
13699 <div class="titlepage"><div><div><h5 class="title">
13700 <a name="thread.synchronization.futures.reference.packaged_task"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a>
13701 </h5></div></div></div>
13702 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span>
13703 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
13704 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span>
13705 <span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">ArgTypes</span>
13706 <span class="special">></span>
13707 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">)></span>
13708 <span class="special">{</span>
13709 <span class="keyword">public</span><span class="special">:</span>
13710 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13711 <span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13713 <span class="comment">// construction and destruction</span>
13714 <span class="identifier">packaged_task</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
13716 <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
13718 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
13719 <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
13721 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13722 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
13723 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13724 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
13726 <span class="special">~</span><span class="identifier">packaged_task</span><span class="special">()</span>
13727 <span class="special">{}</span>
13729 <span class="comment">// move support</span>
13730 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13731 <span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13733 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13735 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
13736 <span class="comment">// result retrieval</span>
13737 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span>
13739 <span class="comment">// execution</span>
13740 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgTypes</span><span class="special">...</span> <span class="special">);</span>
13741 <span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span>
13743 <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
13744 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13745 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13746 <span class="special">};</span>
13748 <div class="section">
13749 <div class="titlepage"><div><div><h6 class="title">
13750 <a name="thread.synchronization.futures.reference.packaged_task.task_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.task_constructor" title="Task Constructor">Task
13752 </h6></div></div></div>
13753 <pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
13755 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
13756 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span><span class="identifier">f</span><span class="special">);</span>
13758 <div class="variablelist">
13759 <p class="title"><b></b></p>
13760 <dl class="variablelist">
13761 <dt><span class="term">Preconditions:</span></dt>
13763 <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
13764 is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> must behave the same as invoking
13765 <code class="computeroutput"><span class="identifier">f</span></code>.
13767 <dt><span class="term">Effects:</span></dt>
13769 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with
13770 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)</span></code>
13771 stored as the associated task.
13773 <dt><span class="term">Throws:</span></dt>
13776 - Any exceptions thrown by the copy (or move) constructor of
13777 <code class="computeroutput"><span class="identifier">f</span></code>.
13780 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory for the
13781 internal data structures could not be allocated.
13784 <dt><span class="term">Notes:</span></dt>
13786 The R(*f)(ArgTypes...)) overload to allow passing a function
13787 without needing to use <code class="computeroutput"><span class="special">&</span></code>.
13789 <dt><span class="term">Remark:</span></dt>
13791 This constructor doesn't participate in overload resolution if
13792 decay<F>::type is the same type as boost::packaged_task<R>.
13797 <div class="section">
13798 <div class="titlepage"><div><div><h6 class="title">
13799 <a name="thread.synchronization.futures.reference.packaged_task.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.alloc_constructor" title="Allocator Constructor">Allocator
13801 </h6></div></div></div>
13802 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13803 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
13804 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span>
13805 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
13807 <div class="variablelist">
13808 <p class="title"><b></b></p>
13809 <dl class="variablelist">
13810 <dt><span class="term">Preconditions:</span></dt>
13812 <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
13813 is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> shall behave the same as
13814 invoking <code class="computeroutput"><span class="identifier">f</span></code>.
13816 <dt><span class="term">Effects:</span></dt>
13818 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with
13819 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)</span></code>
13820 stored as the associated task using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
13822 <dt><span class="term">Throws:</span></dt>
13824 Any exceptions thrown by the copy (or move) constructor of <code class="computeroutput"><span class="identifier">f</span></code>. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code>
13825 if memory for the internal data structures could not be allocated.
13827 <dt><span class="term">Notes:</span></dt>
13829 Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
13831 <dt><span class="term">Notes:</span></dt>
13833 The R(*f)(ArgTypes...)) overload to allow passing a function
13834 without needing to use <code class="computeroutput"><span class="special">&</span></code>.
13839 <div class="section">
13840 <div class="titlepage"><div><div><h6 class="title">
13841 <a name="thread.synchronization.futures.reference.packaged_task.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_constructor" title="Move Constructor">Move
13843 </h6></div></div></div>
13844 <pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
13846 <div class="variablelist">
13847 <p class="title"><b></b></p>
13848 <dl class="variablelist">
13849 <dt><span class="term">Effects:</span></dt>
13851 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, and transfers
13852 ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code>
13853 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13854 leaving <code class="computeroutput"><span class="identifier">other</span></code>
13855 with no associated task.
13857 <dt><span class="term">Throws:</span></dt>
13861 <dt><span class="term">Notes:</span></dt>
13863 If the compiler does not support rvalue-references, this is implemented
13864 using the boost.thread move emulation.
13869 <div class="section">
13870 <div class="titlepage"><div><div><h6 class="title">
13871 <a name="thread.synchronization.futures.reference.packaged_task.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_assignment" title="Move Assignment Operator">Move
13872 Assignment Operator</a>
13873 </h6></div></div></div>
13874 <pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
13876 <div class="variablelist">
13877 <p class="title"><b></b></p>
13878 <dl class="variablelist">
13879 <dt><span class="term">Effects:</span></dt>
13881 Transfers ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code>
13882 with no associated task. If there was already a task associated
13883 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13884 and that task has not been invoked, sets any futures associated
13885 with that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as
13888 <dt><span class="term">Throws:</span></dt>
13892 <dt><span class="term">Notes:</span></dt>
13894 If the compiler does not support rvalue-references, this is implemented
13895 using the boost.thread move emulation.
13900 <div class="section">
13901 <div class="titlepage"><div><div><h6 class="title">
13902 <a name="thread.synchronization.futures.reference.packaged_task.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.destructor" title="Destructor">Destructor</a>
13903 </h6></div></div></div>
13904 <pre class="programlisting"><span class="special">~</span><span class="identifier">packaged_task</span><span class="special">();</span>
13906 <div class="variablelist">
13907 <p class="title"><b></b></p>
13908 <dl class="variablelist">
13909 <dt><span class="term">Effects:</span></dt>
13911 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13912 If there was a task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that task has not been
13913 invoked, sets any futures associated with that task to <span class="emphasis"><em>ready</em></span>
13914 with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
13915 exception as the result.
13917 <dt><span class="term">Throws:</span></dt>
13924 <div class="section">
13925 <div class="titlepage"><div><div><h6 class="title">
13926 <a name="thread.synchronization.futures.reference.packaged_task.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.get_future" title="Member Function get_future()">Member
13927 Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
13928 </h6></div></div></div>
13929 <pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span>
13931 <div class="variablelist">
13932 <p class="title"><b></b></p>
13933 <dl class="variablelist">
13934 <dt><span class="term">Effects:</span></dt>
13936 Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with
13937 the result of the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13939 <dt><span class="term">Throws:</span></dt>
13941 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
13942 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
13943 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if
13944 the future associated with the task has already been retrieved.
13949 <div class="section">
13950 <div class="titlepage"><div><div><h6 class="title">
13951 <a name="thread.synchronization.futures.reference.packaged_task.call_operator"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.call_operator" title="Member Function operator()()">Member
13952 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a>
13953 </h6></div></div></div>
13954 <pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span>
13956 <div class="variablelist">
13957 <p class="title"><b></b></p>
13958 <dl class="variablelist">
13959 <dt><span class="term">Effects:</span></dt>
13961 Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
13962 corresponding future. If the task returns normally, the return
13963 value is stored as the shared state, otherwise the exception
13964 thrown is stored. Any threads blocked waiting for the shared
13965 state associated with this task are woken.
13967 <dt><span class="term">Postconditions:</span></dt>
13969 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13971 <dt><span class="term">Throws:</span></dt>
13974 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
13975 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
13976 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
13979 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
13980 task has already been invoked.
13986 <div class="section">
13987 <div class="titlepage"><div><div><h6 class="title">
13988 <a name="thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit" title="Member Function make_ready_at_thread_exit()">Member
13989 Function <code class="computeroutput"><span class="identifier">make_ready_at_thread_exit</span><span class="special">()</span></code></a>
13990 </h6></div></div></div>
13991 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span>
13993 <div class="variablelist">
13994 <p class="title"><b></b></p>
13995 <dl class="variablelist">
13996 <dt><span class="term">Effects:</span></dt>
13998 Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
13999 corresponding future. If the task returns normally, the return
14000 value is stored as the shared state, otherwise the exception
14001 thrown is stored. In either case, this is done without making
14002 that state ready immediately. Schedules the shared state to be
14003 made ready when the current thread exits, after all objects of
14004 thread storage duration associated with the current thread have
14007 <dt><span class="term">Throws:</span></dt>
14010 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14011 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14012 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
14015 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
14016 task has already been invoked.
14022 <div class="section">
14023 <div class="titlepage"><div><div><h6 class="title">
14024 <a name="thread.synchronization.futures.reference.packaged_task.reset"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.reset" title="Member Function reset()">Member
14025 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
14026 </h6></div></div></div>
14027 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
14029 <div class="variablelist">
14030 <p class="title"><b></b></p>
14031 <dl class="variablelist">
14032 <dt><span class="term">Effects:</span></dt>
14034 Reset the state of the packaged_task so that it can be called
14037 <dt><span class="term">Throws:</span></dt>
14039 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14040 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14041 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
14046 <div class="section">
14047 <div class="titlepage"><div><div><h6 class="title">
14048 <a name="thread.synchronization.futures.reference.packaged_task.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member
14049 Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
14050 </h6></div></div></div>
14051 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
14052 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
14054 <div class="variablelist">
14055 <p class="title"><b></b></p>
14056 <dl class="variablelist">
14057 <dt><span class="term">Preconditions:</span></dt>
14059 The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code>
14060 is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> shall
14061 be well-formed. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14062 shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
14064 <dt><span class="term">Effects:</span></dt>
14066 Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14067 with the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>.
14068 This will replace any existing wait callback store alongside
14069 that task. If a thread subsequently calls one of the wait functions
14070 on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated
14071 with this task, and the result of the task is not <span class="emphasis"><em>ready</em></span>,
14072 <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
14075 <dt><span class="term">Throws:</span></dt>
14077 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14078 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14079 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
14085 <div class="section">
14086 <div class="titlepage"><div><div><h5 class="title">
14087 <a name="thread.synchronization.futures.reference.decay_copy"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.decay_copy" title="Non-member function decay_copy()">Non-member
14088 function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a>
14089 </h5></div></div></div>
14090 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
14091 <span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">v</span><span class="special">)</span>
14092 <span class="special">{</span>
14093 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">v</span><span class="special">);</span>
14094 <span class="special">}</span>
14097 <div class="section">
14098 <div class="titlepage"><div><div><h5 class="title">
14099 <a name="thread.synchronization.futures.reference.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async" title="Non-member function async()">Non-member
14100 function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a>
14101 </h5></div></div></div>
14103 The function template async provides a mechanism to launch a function
14104 potentially in a new thread and provides the result of the function in
14105 a future object with which it shares a shared state.
14108 <a name="thread.synchronization.futures.reference.async.h0"></a>
14109 <span class="phrase"><a name="thread.synchronization.futures.reference.async.non_variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.non_variadic_variant">Non-Variadic
14112 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
14113 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span>
14114 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
14115 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
14116 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span>
14117 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
14118 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
14119 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
14120 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
14122 <div class="variablelist">
14123 <p class="title"><b></b></p>
14124 <dl class="variablelist">
14125 <dt><span class="term">Requires:</span></dt>
14129 <pre class="programlisting"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span>
14134 shall be a valid expression.
14137 <dt><span class="term">Effects</span></dt>
14140 The first function behaves the same as a call to the second function
14141 with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14142 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14143 and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>.
14146 The second and third functions create a shared state that is associated
14147 with the returned future object.
14150 The further behavior of the second function depends on the policy
14151 argument as follows (if more than one of these conditions applies,
14152 the implementation may choose any of the corresponding policies):
14155 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span>
14156 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span></code>
14157 as if in a new thread of execution represented by a thread object
14158 with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
14159 that called <code class="computeroutput"><span class="identifier">async</span></code>.
14160 Any return value is stored as the result in the shared state. Any
14161 exception propagated from the execution of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span></code> is stored as the exceptional
14162 result in the shared state. The thread object is stored in the
14163 shared state and affects the behavior of any asynchronous return
14164 objects that reference that state.
14167 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span>
14168 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
14169 <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code>
14170 in the shared state. This copy of <code class="computeroutput"><span class="identifier">f</span></code>
14171 constitute a deferred function. Invocation of the deferred function
14172 evaluates <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code> where <code class="computeroutput"><span class="identifier">g</span></code>
14173 is the stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code>. The shared state is not made
14174 ready until the function has completed. The first call to a non-timed
14175 waiting function on an asynchronous return object referring to
14176 this shared state shall invoke the deferred function in the thread
14177 that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code>
14178 begins, the function is no longer considered deferred. (Note: If
14179 this policy is specified together with other policies, such as
14180 when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14181 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
14182 implementations should defer invocation or the selection of the
14183 policy when no more concurrency can be effectively exploited.)
14186 - if no valid launch policy is provided the behavior is undefined.
14189 The further behavior of the third function is as follows:
14192 - The Executor::submit() function is given a function<void ()>
14193 which calls `INVOKE (DECAY_COPY (std::forward<F>(f)), DECAY_COPY
14194 (std::forward<Args>(args))...). The implementation of the
14195 executor is decided by the programmer.
14198 <dt><span class="term">Returns:</span></dt>
14200 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span>
14201 <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span></code>
14202 that refers to the shared state created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
14204 <dt><span class="term">Synchronization:</span></dt>
14207 Regardless of the provided policy argument,
14210 - the invocation of <code class="computeroutput"><span class="identifier">async</span></code>
14211 synchronizes with the invocation of <code class="computeroutput"><span class="identifier">f</span></code>.
14212 (Note: This statement applies even when the corresponding future
14213 object is moved to another thread.); and
14216 - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
14217 is sequenced before the shared state is made ready. (Note: <code class="computeroutput"><span class="identifier">f</span></code> might not be called at all,
14218 so its completion might never happen.)
14221 If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14225 - a call to a non-timed waiting function on an asynchronous return
14226 object that shares the shared state created by this async call
14227 shall block until the associated thread has completed, as if joined,
14231 - the associated thread completion synchronizes with the return
14232 from the first function that successfully detects the ready status
14233 of the shared state or with the return from the last function that
14234 releases the shared state, whichever happens first.
14237 <dt><span class="term">Throws:</span></dt>
14239 <code class="computeroutput"><span class="identifier">system_error</span></code> if
14240 policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14241 and the implementation is unable to start a new thread.
14243 <dt><span class="term">Error conditions:</span></dt>
14245 - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
14246 - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14247 and the system is unable to start a new thread.
14249 <dt><span class="term">Remarks::</span></dt>
14251 The first signature shall not participate in overload resolution
14252 if <code class="computeroutput"><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span>
14253 <span class="identifier">is</span> </code>boost:: launch<code class="computeroutput">
14254 <span class="keyword">or</span> </code>boost::is_executor<F><code class="computeroutput">
14255 <span class="identifier">is</span> </code>true_type`.
14260 <a name="thread.synchronization.futures.reference.async.h1"></a>
14261 <span class="phrase"><a name="thread.synchronization.futures.reference.async.variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.variadic_variant">Variadic
14264 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
14265 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
14266 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
14267 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
14268 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
14269 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
14270 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span>
14271 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span>
14272 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span>
14274 <div class="warning"><table border="0" summary="Warning">
14276 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
14277 <th align="left">Warning</th>
14279 <tr><td align="left" valign="top"><p>
14280 the variadic prototype is provided only on C++11 compilers supporting
14281 rvalue references, variadic templates, decltype and a standard library
14282 providing <tuple> (waiting for a boost::tuple that is move aware),
14283 and BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK is defined.
14286 <div class="variablelist">
14287 <p class="title"><b></b></p>
14288 <dl class="variablelist">
14289 <dt><span class="term">Requires:</span></dt>
14292 <code class="computeroutput"><span class="identifier">F</span></code> and each <code class="computeroutput"><span class="identifier">Ti</span></code> in <code class="computeroutput"><span class="identifier">Args</span></code>
14293 shall satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
14297 invoke (decay_copy (boost::forward<F>(f)), decay_copy (boost::forward<Args>(args))...)
14300 shall be a valid expression.
14303 <dt><span class="term">Effects:</span></dt>
14306 - The first function behaves the same as a call to the second function
14307 with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14308 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14309 and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>
14310 and <code class="computeroutput"><span class="identifier">Args</span></code>.
14313 - The second function creates a shared state that is associated
14314 with the returned future object. The further behavior of the second
14315 function depends on the policy argument as follows (if more than
14316 one of these conditions applies, the implementation may choose
14317 any of the corresponding policies):
14320 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span>
14321 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span>
14322 <span class="identifier">decay_copy</span> <span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code>
14323 as if in a new thread of execution represented by a thread object
14324 with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
14325 that called <code class="computeroutput"><span class="identifier">async</span></code>.
14326 Any return value is stored as the result in the shared state. Any
14327 exception propagated from the execution of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> <span class="identifier">decay_copy</span>
14328 <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code> is stored as the exceptional
14329 result in the shared state. The thread object is stored in the
14330 shared state and affects the behavior of any asynchronous return
14331 objects that reference that state.
14334 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span>
14335 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
14336 <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code>
14337 and <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...</span></code> in the shared state. These
14338 copies of <code class="computeroutput"><span class="identifier">f</span></code> and
14339 <code class="computeroutput"><span class="identifier">args</span></code> constitute
14340 a deferred function. Invocation of the deferred function evaluates
14341 <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span>
14342 <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
14343 where <code class="computeroutput"><span class="identifier">g</span></code> is the
14344 stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code> and <code class="computeroutput"><span class="identifier">xyz</span></code>
14345 is the stored copy of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...</span></code>. The shared state is not made
14346 ready until the function has completed. The first call to a non-timed
14347 waiting function on an asynchronous return object referring to
14348 this shared state shall invoke the deferred function in the thread
14349 that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span>
14350 <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
14351 begins, the function is no longer considered deferred.
14354 - if no valid launch policy is provided the behaviour is undefined.
14357 <dt><span class="term">Note:</span></dt>
14359 If this policy is specified together with other policies, such
14360 as when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14361 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
14362 implementations should defer invocation or the selection of the
14363 policy when no more concurrency can be effectively exploited.
14365 <dt><span class="term">Returns:</span></dt>
14367 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span>
14368 <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span></code> that refers to the shared state
14369 created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
14371 <dt><span class="term">Synchronization:</span></dt>
14374 Regardless of the provided policy argument,
14377 - the invocation of async synchronizes with the invocation of
14378 <code class="computeroutput"><span class="identifier">f</span></code>. (Note: This
14379 statement applies even when the corresponding future object is
14380 moved to another thread.); and
14383 - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
14384 is sequenced before the shared state is made ready. (Note: f might
14385 not be called at all, so its completion might never happen.)
14388 If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14392 - a call to a waiting function on an asynchronous return object
14393 that shares the shared state created by this async call shall block
14394 until the associated thread has completed, as if joined, or else
14398 - the associated thread completion synchronizes with the return
14399 from the first function that successfully detects the ready status
14400 of the shared state or with the return from the last function that
14401 releases the shared state, whichever happens first.
14404 <dt><span class="term">Throws:</span></dt>
14406 <code class="computeroutput"><span class="identifier">system_error</span></code> if
14407 policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14408 and the implementation is unable to start a new thread.
14410 <dt><span class="term">Error conditions:</span></dt>
14412 - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
14413 - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14414 and the system is unable to start a new thread.
14416 <dt><span class="term">Remarks:</span></dt>
14418 The first signature shall not participate in overload resolution
14419 if decay<F>::type is boost::launch.
14424 <div class="section">
14425 <div class="titlepage"><div><div><h5 class="title">
14426 <a name="thread.synchronization.futures.reference.wait_for_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION">Non-member
14427 function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
14429 </h5></div></div></div>
14430 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span>
14431 <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14433 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">></span>
14434 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14436 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">></span>
14437 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14439 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">></span>
14440 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14442 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F5</span><span class="special">></span>
14443 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14445 <div class="variablelist">
14446 <p class="title"><b></b></p>
14447 <dl class="variablelist">
14448 <dt><span class="term">Preconditions:</span></dt>
14450 The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
14451 be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator
14452 with a <code class="computeroutput"><span class="identifier">value_type</span></code>
14453 which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>.
14455 <dt><span class="term">Effects:</span></dt>
14457 Waits until at least one of the specified futures is <span class="emphasis"><em>ready</em></span>.
14459 <dt><span class="term">Returns:</span></dt>
14461 The range-based overload returns an <code class="computeroutput"><span class="identifier">Iterator</span></code>
14462 identifying the first future in the range that was detected as
14463 <span class="emphasis"><em>ready</em></span>. The remaining overloads return the
14464 zero-based index of the first future that was detected as <span class="emphasis"><em>ready</em></span>
14465 (first parameter => 0, second parameter => 1, etc.).
14467 <dt><span class="term">Throws:</span></dt>
14469 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current
14470 thread is interrupted. Any exception thrown by the <span class="emphasis"><em>wait
14471 callback</em></span> associated with any of the futures being waited
14472 for. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory could not
14473 be allocated for the internal wait structures.
14475 <dt><span class="term">Notes:</span></dt>
14477 <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
14478 is an <span class="emphasis"><em>interruption point</em></span>.
14483 <div class="section">
14484 <div class="titlepage"><div><div><h5 class="title">
14485 <a name="thread.synchronization.futures.reference.wait_for_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION">Non-member
14486 function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
14488 </h5></div></div></div>
14489 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span>
14490 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14492 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">></span>
14493 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14495 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">></span>
14496 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14498 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">></span>
14499 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14501 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F5</span><span class="special">></span>
14502 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14504 <div class="variablelist">
14505 <p class="title"><b></b></p>
14506 <dl class="variablelist">
14507 <dt><span class="term">Preconditions:</span></dt>
14509 The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
14510 be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator
14511 with a <code class="computeroutput"><span class="identifier">value_type</span></code>
14512 which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>.
14514 <dt><span class="term">Effects:</span></dt>
14516 Waits until all of the specified futures are <span class="emphasis"><em>ready</em></span>.
14518 <dt><span class="term">Throws:</span></dt>
14520 Any exceptions thrown by a call to <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> on the specified futures.
14522 <dt><span class="term">Notes:</span></dt>
14524 <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
14525 is an <span class="emphasis"><em>interruption point</em></span>.
14530 <div class="section">
14531 <div class="titlepage"><div><div><h5 class="title">
14532 <a name="thread.synchronization.futures.reference.when_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_all" title="Non-member function when_all() - EXTENSION">Non-member
14533 function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
14535 </h5></div></div></div>
14536 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span>
14537 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span>
14538 <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
14540 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">></span>
14541 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...></span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span>
14543 <div class="variablelist">
14544 <p class="title"><b></b></p>
14545 <dl class="variablelist">
14546 <dt><span class="term">Requires:</span></dt>
14548 - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
14549 value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. All <code class="computeroutput"><span class="identifier">R</span></code>
14550 types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> objects are in invalid state
14551 (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14552 <span class="special">==</span> <span class="keyword">false</span></code>),
14553 the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>
14554 or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The effect of calling <code class="computeroutput"><span class="identifier">when_all</span></code> on a <code class="computeroutput"><span class="identifier">future</span></code>
14555 or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
14556 object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
14557 <span class="keyword">false</span></code> is undefined.
14559 <dt><span class="term">Notes:</span></dt>
14562 - There are two variations of <code class="computeroutput"><span class="identifier">when_all</span></code>.
14563 The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
14564 The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R0</span><span class="special">></span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R1</span><span class="special">></span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code>
14565 need not be the same type.
14568 - Calling the first signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
14569 where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
14570 first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
14573 - Calling the second signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
14574 with no arguments returns a future<tuple<>> that is
14578 <dt><span class="term">Effects:</span></dt>
14581 - If any of the futures supplied to a call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14582 refer to deferred tasks that have not started execution, those
14583 tasks are executed before the call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14584 returns. Once all such tasks have been executed, the call to <code class="computeroutput"><span class="identifier">when_all</span></code> returns immediately.
14587 - The call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14588 does not wait for non-deferred tasks, or deferred tasks that have
14589 already started executing elsewhere, to complete before returning.
14592 - Once all the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s supplied to the
14593 call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14594 are ready, the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s are moved/copied
14595 into the associated state of the future returned from the call
14596 to <code class="computeroutput"><span class="identifier">when_all</span></code>, preserving
14597 the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_all</span></code>.
14600 - The collection is then stored as the result in a newly created
14604 - A new future object that refers to the shared state is created.
14605 The exact type of the future is further described below.
14608 - The <code class="computeroutput"><span class="identifier">future</span></code> returned
14609 by <code class="computeroutput"><span class="identifier">when_all</span></code> will
14610 not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the
14611 output collection may.
14614 <dt><span class="term">Returns:</span></dt>
14617 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><>></span></code>
14618 if <code class="computeroutput"><span class="identifier">when_all</span></code> is
14619 called with zero arguments.
14622 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code>
14623 if the input cardinality is unknown at compile and the iterator
14624 pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in
14625 the output vector will be the same as given by the input iterator.
14628 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code>
14629 if the input cardinality is unknown at compile time and the iterator
14630 pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in
14631 the output vector will be the same as given by the input iterator.
14634 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...>></span></code>
14635 if inputs are fixed in number.
14638 <dt><span class="term">Postconditions:</span></dt>
14641 - All input futures valid() == false.
14644 - All input shared future valid() == true.
14653 <div class="section">
14654 <div class="titlepage"><div><div><h5 class="title">
14655 <a name="thread.synchronization.futures.reference.when_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_any" title="Non-member function when_any() - EXTENSION">Non-member
14656 function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
14658 </h5></div></div></div>
14659 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span>
14660 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span>
14661 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
14663 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">></span>
14664 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...></span>
14665 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span>
14667 <div class="variablelist">
14668 <p class="title"><b></b></p>
14669 <dl class="variablelist">
14670 <dt><span class="term">Requires:</span></dt>
14672 - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
14673 value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. All <code class="computeroutput"><span class="identifier">R</span></code>
14674 types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> objects are in invalid state
14675 (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14676 <span class="special">==</span> <span class="keyword">false</span></code>),
14677 the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>
14678 or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The effect of calling <code class="computeroutput"><span class="identifier">when_any</span></code> on a <code class="computeroutput"><span class="identifier">future</span></code>
14679 or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
14680 object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
14681 <span class="keyword">false</span> <span class="identifier">is</span>
14682 <span class="identifier">undefined</span></code>.
14684 <dt><span class="term">Notes:</span></dt>
14687 - There are two variations of <code class="computeroutput"><span class="identifier">when_any</span>
14688 </code>. The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
14689 The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R0</span><span class="special">></span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R1</span><span class="special">></span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code>
14690 need not be the same type.
14693 - Calling the first signature of <code class="computeroutput"><span class="identifier">when_any</span>
14694 </code> where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
14695 first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
14698 - Calling the second signature of <code class="computeroutput"><span class="identifier">when_any</span></code>
14699 with no arguments returns a future<tuple<>> that is
14703 <dt><span class="term">Effects:</span></dt>
14706 - Each of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>
14707 is checked in the order supplied. If a given future is ready, then
14708 no further futures are checked, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14709 returns immediately. If a given future refers to a deferred task
14710 that has not yet started execution, then no further futures are
14711 checked, that task is executed, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14712 then returns immediately.
14715 - The call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14716 does not wait for non-deferred tasks, or deferred tasks that have
14717 already started executing elsewhere, to complete before returning.
14720 - Once at least one of the futures supplied to the call to <code class="computeroutput"><span class="identifier">when_any</span></code> are ready, the futures
14721 are moved into the associated state of the future returned from
14722 the call to <code class="computeroutput"><span class="identifier">when_any</span></code>,
14723 preserving the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>.
14724 That future is then ready.
14727 - The collection is then stored as the result in a newly created
14731 - A new future object that refers to the shared state is created.
14732 The exact type of the future is further described below.
14735 - The future returned by <code class="computeroutput"><span class="identifier">when_any</span></code>
14736 will not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the
14737 output collection may.
14740 <dt><span class="term">Returns:</span></dt>
14743 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><>></span></code>
14744 if <code class="computeroutput"><span class="identifier">when_any</span> </code> is
14745 called with zero arguments.
14748 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code>
14749 if the input cardinality is unknown at compile and the iterator
14750 pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in
14751 the output vector will be the same as given by the input iterator.
14754 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code>
14755 if the input cardinality is unknown at compile time and the iterator
14756 pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in
14757 the output vector will be the same as given by the input iterator.
14760 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decat_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...>></span></code>
14761 if inputs are fixed in number.
14764 <dt><span class="term">Postconditions:</span></dt>
14767 - All input futures valid() == false.
14770 - All input shared_futures valid() == true.
14779 <div class="section">
14780 <div class="titlepage"><div><div><h5 class="title">
14781 <a name="thread.synchronization.futures.reference.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_ready_future" title="Non-member function make_ready_future() EXTENSION">Non-member
14782 function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a>
14783 </h5></div></div></div>
14784 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
14785 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14786 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
14787 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
14788 <span class="identifier">future</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
14789 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
14790 <span class="identifier">future</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
14792 <div class="variablelist">
14793 <p class="title"><b></b></p>
14794 <dl class="variablelist">
14795 <dt><span class="term">Effects:</span></dt>
14798 - value prototype: The value that is passed into the function is
14799 moved to the shared state of the returned function if it is an
14800 rvalue. Otherwise the value is copied to the shared state of the
14804 - exception: The exception that is passed into the function is
14805 copied to the shared state of the returned function.
14811 <dt><span class="term">Returns:</span></dt>
14814 - a ready future with the value set with <code class="computeroutput"><span class="identifier">value</span></code>
14817 - a ready future with the exception set with <code class="computeroutput"><span class="identifier">ex</span></code>
14820 - a ready future<void> with the value set (void).
14823 <dt><span class="term">Postcondition:</span></dt>
14826 - Returned future, valid() == true
14829 - Returned future, is_ready() = true
14832 - Returned future, has_value() = true or has_exception() depending
14839 <div class="section">
14840 <div class="titlepage"><div><div><h5 class="title">
14841 <a name="thread.synchronization.futures.reference.make_exceptional"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_exceptional" title="Non-member function make_exceptional() EXTENSION">Non-member
14842 function <code class="computeroutput"><span class="identifier">make_exceptional</span><span class="special">()</span></code> EXTENSION</a>
14843 </h5></div></div></div>
14844 <pre class="programlisting"><span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14845 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span>
14846 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14847 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
14849 <div class="variablelist">
14850 <p class="title"><b></b></p>
14851 <dl class="variablelist">
14852 <dt><span class="term">Effects:</span></dt>
14854 The exception that is passed in to the function or the current
14855 exception if no parameter is given is moved into the returned
14856 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>
14857 if it is an rvalue. Otherwise the exception is copied into the
14858 returned <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
14860 <dt><span class="term">Returns:</span></dt>
14862 An exceptional_ptr instance implicitly convertible to a future<T>
14867 <div class="section">
14868 <div class="titlepage"><div><div><h5 class="title">
14869 <a name="thread.synchronization.futures.reference.make_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_future" title="Non-member function make_future() DEPRECATED">Non-member
14870 function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
14872 </h5></div></div></div>
14873 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
14874 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
14875 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span>
14877 <div class="variablelist">
14878 <p class="title"><b></b></p>
14879 <dl class="variablelist">
14880 <dt><span class="term">Effects:</span></dt>
14882 The value that is passed into the function is moved to the shared
14883 state of the returned function if it is an rvalue. Otherwise the
14884 value is copied to the shared state of the returned function. .
14886 <dt><span class="term">Returns:</span></dt>
14889 - future<T>, if function is given a value of type T
14892 - future<void>, if the function is not given any inputs.
14895 <dt><span class="term">Postcondition:</span></dt>
14898 - Returned future<T>, valid() == true
14901 - Returned future<T>, is_ready() = true
14904 <dt><span class="term">See:</span></dt>
14906 <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code>
14911 <div class="section">
14912 <div class="titlepage"><div><div><h5 class="title">
14913 <a name="thread.synchronization.futures.reference.make_shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_shared_future" title="Non-member function make_shared_future() DEPRECATED">Non-member
14914 function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a>
14915 </h5></div></div></div>
14916 <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
14917 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
14918 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span>
14920 <div class="variablelist">
14921 <p class="title"><b></b></p>
14922 <dl class="variablelist">
14923 <dt><span class="term">Effects:</span></dt>
14925 The value that is passed in to the function is moved to the shared
14926 state of the returned function if it is an rvalue. Otherwise the
14927 value is copied to the shared state of the returned function. .
14929 <dt><span class="term">Returns:</span></dt>
14932 - shared_future<T>, if function is given a value of type
14936 - shared_future<void>, if the function is not given any inputs.
14939 <dt><span class="term">Postcondition:</span></dt>
14942 - Returned shared_future<T>, valid() == true
14945 - Returned shared_future<T>, is_ready() = true
14948 <dt><span class="term">See:</span></dt>
14950 <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">future</span><span class="special"><>::</span><span class="identifier">share</span><span class="special">()</span></code>
14958 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
14959 <td align="left"></td>
14960 <td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -14 Vicente J. Botet Escriba<p>
14961 Distributed under the Boost Software License, Version 1.0. (See accompanying
14962 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
14967 <div class="spirit-nav">
14968 <a accesskey="p" href="ScopedThreads.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="thread_local_storage.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>