]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/doc/html/fiber/synchronization/mutex_types.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / fiber / doc / html / fiber / synchronization / mutex_types.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Mutex Types</title>
5 <link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
7 <link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Fiber">
8 <link rel="up" href="../synchronization.html" title="Synchronization">
9 <link rel="prev" href="../synchronization.html" title="Synchronization">
10 <link rel="next" href="conditions.html" title="Condition Variables">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <a accesskey="p" href="../synchronization.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../synchronization.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="conditions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h3 class="title">
27 <a name="fiber.synchronization.mutex_types"></a><a class="link" href="mutex_types.html" title="Mutex Types">Mutex Types</a>
28 </h3></div></div></div>
29 <p>
30 </p>
31 <h5>
32 <a name="class_mutex_bridgehead"></a>
33 <span><a name="class_mutex"></a></span>
34 <a class="link" href="mutex_types.html#class_mutex">Class <code class="computeroutput">mutex</code></a>
35 </h5>
36 <p>
37 </p>
38 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
39
40 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
41 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
42
43 <span class="keyword">class</span> <span class="identifier">mutex</span> <span class="special">{</span>
44 <span class="keyword">public</span><span class="special">:</span>
45 <span class="identifier">mutex</span><span class="special">();</span>
46 <span class="special">~</span><span class="identifier">mutex</span><span class="special">();</span>
47
48 <span class="identifier">mutex</span><span class="special">(</span> <span class="identifier">mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
49 <span class="identifier">mutex</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
50
51 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
52 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
53 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
54 <span class="special">};</span>
55
56 <span class="special">}}</span>
57 </pre>
58 <p>
59 <a class="link" href="mutex_types.html#class_mutex"><code class="computeroutput">mutex</code></a> provides an exclusive-ownership mutex. At most one fiber
60 can own the lock on a given instance of <a class="link" href="mutex_types.html#class_mutex"><code class="computeroutput">mutex</code></a> at any time. Multiple
61 concurrent calls to <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> shall be permitted.
62 </p>
63 <p>
64 Any fiber blocked in <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code> is suspended until the owning fiber releases
65 the lock by calling <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>.
66 </p>
67 <p>
68 </p>
69 <h5>
70 <a name="mutex_lock_bridgehead"></a>
71 <span><a name="mutex_lock"></a></span>
72 <a class="link" href="mutex_types.html#mutex_lock">Member function <code class="computeroutput">lock</code>()</a>
73 </h5>
74 <p>
75 </p>
76 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
77 </pre>
78 <div class="variablelist">
79 <p class="title"><b></b></p>
80 <dl>
81 <dt><span class="term">Precondition:</span></dt>
82 <dd><p>
83 The calling fiber doesn't own the mutex.
84 </p></dd>
85 <dt><span class="term">Effects:</span></dt>
86 <dd><p>
87 The current fiber blocks until ownership can be obtained.
88 </p></dd>
89 <dt><span class="term">Throws:</span></dt>
90 <dd><p>
91 <code class="computeroutput"><span class="identifier">lock_error</span></code>
92 </p></dd>
93 <dt><span class="term">Error Conditions:</span></dt>
94 <dd><p>
95 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
96 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
97 already owns the mutex.
98 </p></dd>
99 </dl>
100 </div>
101 <p>
102 </p>
103 <h5>
104 <a name="mutex_try_lock_bridgehead"></a>
105 <span><a name="mutex_try_lock"></a></span>
106 <a class="link" href="mutex_types.html#mutex_try_lock">Member function <code class="computeroutput">try_lock</code>()</a>
107 </h5>
108 <p>
109 </p>
110 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
111 </pre>
112 <div class="variablelist">
113 <p class="title"><b></b></p>
114 <dl>
115 <dt><span class="term">Precondition:</span></dt>
116 <dd><p>
117 The calling fiber doesn't own the mutex.
118 </p></dd>
119 <dt><span class="term">Effects:</span></dt>
120 <dd><p>
121 Attempt to obtain ownership for the current fiber without blocking.
122 </p></dd>
123 <dt><span class="term">Returns:</span></dt>
124 <dd><p>
125 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
126 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
127 otherwise.
128 </p></dd>
129 <dt><span class="term">Throws:</span></dt>
130 <dd><p>
131 <code class="computeroutput"><span class="identifier">lock_error</span></code>
132 </p></dd>
133 <dt><span class="term">Error Conditions:</span></dt>
134 <dd><p>
135 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
136 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
137 already owns the mutex.
138 </p></dd>
139 </dl>
140 </div>
141 <p>
142 </p>
143 <h5>
144 <a name="mutex_unlock_bridgehead"></a>
145 <span><a name="mutex_unlock"></a></span>
146 <a class="link" href="mutex_types.html#mutex_unlock">Member function <code class="computeroutput">unlock</code>()</a>
147 </h5>
148 <p>
149 </p>
150 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
151 </pre>
152 <div class="variablelist">
153 <p class="title"><b></b></p>
154 <dl>
155 <dt><span class="term">Precondition:</span></dt>
156 <dd><p>
157 The current fiber owns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
158 </p></dd>
159 <dt><span class="term">Effects:</span></dt>
160 <dd><p>
161 Releases a lock on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
162 by the current fiber.
163 </p></dd>
164 <dt><span class="term">Throws:</span></dt>
165 <dd><p>
166 <code class="computeroutput"><span class="identifier">lock_error</span></code>
167 </p></dd>
168 <dt><span class="term">Error Conditions:</span></dt>
169 <dd><p>
170 <span class="bold"><strong>operation_not_permitted</strong></span>: if <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
171 does not own the mutex.
172 </p></dd>
173 </dl>
174 </div>
175 <p>
176 </p>
177 <h5>
178 <a name="class_timed_mutex_bridgehead"></a>
179 <span><a name="class_timed_mutex"></a></span>
180 <a class="link" href="mutex_types.html#class_timed_mutex">Class <code class="computeroutput">timed_mutex</code></a>
181 </h5>
182 <p>
183 </p>
184 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">timed_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
185
186 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
187 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
188
189 <span class="keyword">class</span> <span class="identifier">timed_mutex</span> <span class="special">{</span>
190 <span class="keyword">public</span><span class="special">:</span>
191 <span class="identifier">timed_mutex</span><span class="special">();</span>
192 <span class="special">~</span><span class="identifier">timed_mutex</span><span class="special">();</span>
193
194 <span class="identifier">timed_mutex</span><span class="special">(</span> <span class="identifier">timed_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
195 <span class="identifier">timed_mutex</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">timed_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
196
197 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
198 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
199 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
200
201 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
202 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
203 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
204 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
205 <span class="special">};</span>
206
207 <span class="special">}}</span>
208 </pre>
209 <p>
210 <a class="link" href="mutex_types.html#class_timed_mutex"><code class="computeroutput">timed_mutex</code></a> provides an exclusive-ownership mutex. At most
211 one fiber can own the lock on a given instance of <a class="link" href="mutex_types.html#class_timed_mutex"><code class="computeroutput">timed_mutex</code></a> at
212 any time. Multiple concurrent calls to <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> shall be permitted.
213 </p>
214 <p>
215 </p>
216 <h5>
217 <a name="timed_mutex_lock_bridgehead"></a>
218 <span><a name="timed_mutex_lock"></a></span>
219 <a class="link" href="mutex_types.html#timed_mutex_lock">Member function
220 <code class="computeroutput">lock</code>()</a>
221 </h5>
222 <p>
223 </p>
224 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
225 </pre>
226 <div class="variablelist">
227 <p class="title"><b></b></p>
228 <dl>
229 <dt><span class="term">Precondition:</span></dt>
230 <dd><p>
231 The calling fiber doesn't own the mutex.
232 </p></dd>
233 <dt><span class="term">Effects:</span></dt>
234 <dd><p>
235 The current fiber blocks until ownership can be obtained.
236 </p></dd>
237 <dt><span class="term">Throws:</span></dt>
238 <dd><p>
239 <code class="computeroutput"><span class="identifier">lock_error</span></code>
240 </p></dd>
241 <dt><span class="term">Error Conditions:</span></dt>
242 <dd><p>
243 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
244 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
245 already owns the mutex.
246 </p></dd>
247 </dl>
248 </div>
249 <p>
250 </p>
251 <h5>
252 <a name="timed_mutex_try_lock_bridgehead"></a>
253 <span><a name="timed_mutex_try_lock"></a></span>
254 <a class="link" href="mutex_types.html#timed_mutex_try_lock">Member
255 function <code class="computeroutput">try_lock</code>()</a>
256 </h5>
257 <p>
258 </p>
259 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
260 </pre>
261 <div class="variablelist">
262 <p class="title"><b></b></p>
263 <dl>
264 <dt><span class="term">Precondition:</span></dt>
265 <dd><p>
266 The calling fiber doesn't own the mutex.
267 </p></dd>
268 <dt><span class="term">Effects:</span></dt>
269 <dd><p>
270 Attempt to obtain ownership for the current fiber without blocking.
271 </p></dd>
272 <dt><span class="term">Returns:</span></dt>
273 <dd><p>
274 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
275 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
276 otherwise.
277 </p></dd>
278 <dt><span class="term">Throws:</span></dt>
279 <dd><p>
280 <code class="computeroutput"><span class="identifier">lock_error</span></code>
281 </p></dd>
282 <dt><span class="term">Error Conditions:</span></dt>
283 <dd><p>
284 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
285 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
286 already owns the mutex.
287 </p></dd>
288 </dl>
289 </div>
290 <p>
291 </p>
292 <h5>
293 <a name="timed_mutex_unlock_bridgehead"></a>
294 <span><a name="timed_mutex_unlock"></a></span>
295 <a class="link" href="mutex_types.html#timed_mutex_unlock">Member function
296 <code class="computeroutput">unlock</code>()</a>
297 </h5>
298 <p>
299 </p>
300 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
301 </pre>
302 <div class="variablelist">
303 <p class="title"><b></b></p>
304 <dl>
305 <dt><span class="term">Precondition:</span></dt>
306 <dd><p>
307 The current fiber owns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
308 </p></dd>
309 <dt><span class="term">Effects:</span></dt>
310 <dd><p>
311 Releases a lock on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
312 by the current fiber.
313 </p></dd>
314 <dt><span class="term">Throws:</span></dt>
315 <dd><p>
316 <code class="computeroutput"><span class="identifier">lock_error</span></code>
317 </p></dd>
318 <dt><span class="term">Error Conditions:</span></dt>
319 <dd><p>
320 <span class="bold"><strong>operation_not_permitted</strong></span>: if <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
321 does not own the mutex.
322 </p></dd>
323 </dl>
324 </div>
325 <p>
326 </p>
327 <h5>
328 <a name="timed_mutex_try_lock_until_bridgehead"></a>
329 <span><a name="timed_mutex_try_lock_until"></a></span>
330 <a class="link" href="mutex_types.html#timed_mutex_try_lock_until">Templated
331 member function <code class="computeroutput">try_lock_until</code>()</a>
332 </h5>
333 <p>
334 </p>
335 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
336 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
337 </pre>
338 <div class="variablelist">
339 <p class="title"><b></b></p>
340 <dl>
341 <dt><span class="term">Precondition:</span></dt>
342 <dd><p>
343 The calling fiber doesn't own the mutex.
344 </p></dd>
345 <dt><span class="term">Effects:</span></dt>
346 <dd><p>
347 Attempt to obtain ownership for the current fiber. Blocks until ownership
348 can be obtained, or the specified time is reached. If the specified
349 time has already passed, behaves as <a class="link" href="mutex_types.html#timed_mutex_try_lock"><code class="computeroutput">timed_mutex::try_lock()</code></a>.
350 </p></dd>
351 <dt><span class="term">Returns:</span></dt>
352 <dd><p>
353 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
354 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
355 otherwise.
356 </p></dd>
357 <dt><span class="term">Throws:</span></dt>
358 <dd><p>
359 <code class="computeroutput"><span class="identifier">lock_error</span></code>, timeout-related
360 exceptions.
361 </p></dd>
362 <dt><span class="term">Error Conditions:</span></dt>
363 <dd><p>
364 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
365 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
366 already owns the mutex.
367 </p></dd>
368 </dl>
369 </div>
370 <p>
371 </p>
372 <h5>
373 <a name="timed_mutex_try_lock_for_bridgehead"></a>
374 <span><a name="timed_mutex_try_lock_for"></a></span>
375 <a class="link" href="mutex_types.html#timed_mutex_try_lock_for">Templated
376 member function <code class="computeroutput">try_lock_for</code>()</a>
377 </h5>
378 <p>
379 </p>
380 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
381 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
382 </pre>
383 <div class="variablelist">
384 <p class="title"><b></b></p>
385 <dl>
386 <dt><span class="term">Precondition:</span></dt>
387 <dd><p>
388 The calling fiber doesn't own the mutex.
389 </p></dd>
390 <dt><span class="term">Effects:</span></dt>
391 <dd><p>
392 Attempt to obtain ownership for the current fiber. Blocks until ownership
393 can be obtained, or the specified time is reached. If the specified
394 time has already passed, behaves as <a class="link" href="mutex_types.html#timed_mutex_try_lock"><code class="computeroutput">timed_mutex::try_lock()</code></a>.
395 </p></dd>
396 <dt><span class="term">Returns:</span></dt>
397 <dd><p>
398 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
399 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
400 otherwise.
401 </p></dd>
402 <dt><span class="term">Throws:</span></dt>
403 <dd><p>
404 <code class="computeroutput"><span class="identifier">lock_error</span></code>, timeout-related
405 exceptions.
406 </p></dd>
407 <dt><span class="term">Error Conditions:</span></dt>
408 <dd><p>
409 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if
410 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
411 already owns the mutex.
412 </p></dd>
413 </dl>
414 </div>
415 <p>
416 </p>
417 <h5>
418 <a name="class_recursive_mutex_bridgehead"></a>
419 <span><a name="class_recursive_mutex"></a></span>
420 <a class="link" href="mutex_types.html#class_recursive_mutex">Class
421 <code class="computeroutput">recursive_mutex</code></a>
422 </h5>
423 <p>
424 </p>
425 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
426
427 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
428 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
429
430 <span class="keyword">class</span> <span class="identifier">recursive_mutex</span> <span class="special">{</span>
431 <span class="keyword">public</span><span class="special">:</span>
432 <span class="identifier">recursive_mutex</span><span class="special">();</span>
433 <span class="special">~</span><span class="identifier">recursive_mutex</span><span class="special">();</span>
434
435 <span class="identifier">recursive_mutex</span><span class="special">(</span> <span class="identifier">recursive_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
436 <span class="identifier">recursive_mutex</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">recursive_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
437
438 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
439 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
440 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
441 <span class="special">};</span>
442
443 <span class="special">}}</span>
444 </pre>
445 <p>
446 <a class="link" href="mutex_types.html#class_recursive_mutex"><code class="computeroutput">recursive_mutex</code></a> provides an exclusive-ownership recursive
447 mutex. At most one fiber can own the lock on a given instance of <a class="link" href="mutex_types.html#class_recursive_mutex"><code class="computeroutput">recursive_mutex</code></a> at
448 any time. Multiple concurrent calls to <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> shall be permitted. A fiber that already
449 has exclusive ownership of a given <a class="link" href="mutex_types.html#class_recursive_mutex"><code class="computeroutput">recursive_mutex</code></a> instance
450 can call <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>
451 or <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>
452 to acquire an additional level of ownership of the mutex. <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> must be called once for each level of ownership
453 acquired by a single fiber before ownership can be acquired by another fiber.
454 </p>
455 <p>
456 </p>
457 <h5>
458 <a name="recursive_mutex_lock_bridgehead"></a>
459 <span><a name="recursive_mutex_lock"></a></span>
460 <a class="link" href="mutex_types.html#recursive_mutex_lock">Member
461 function <code class="computeroutput">lock</code>()</a>
462 </h5>
463 <p>
464 </p>
465 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
466 </pre>
467 <div class="variablelist">
468 <p class="title"><b></b></p>
469 <dl>
470 <dt><span class="term">Effects:</span></dt>
471 <dd><p>
472 The current fiber blocks until ownership can be obtained.
473 </p></dd>
474 <dt><span class="term">Throws:</span></dt>
475 <dd><p>
476 Nothing
477 </p></dd>
478 </dl>
479 </div>
480 <p>
481 </p>
482 <h5>
483 <a name="recursive_mutex_try_lock_bridgehead"></a>
484 <span><a name="recursive_mutex_try_lock"></a></span>
485 <a class="link" href="mutex_types.html#recursive_mutex_try_lock">Member
486 function <code class="computeroutput">try_lock</code>()</a>
487 </h5>
488 <p>
489 </p>
490 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
491 </pre>
492 <div class="variablelist">
493 <p class="title"><b></b></p>
494 <dl>
495 <dt><span class="term">Effects:</span></dt>
496 <dd><p>
497 Attempt to obtain ownership for the current fiber without blocking.
498 </p></dd>
499 <dt><span class="term">Returns:</span></dt>
500 <dd><p>
501 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
502 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
503 otherwise.
504 </p></dd>
505 <dt><span class="term">Throws:</span></dt>
506 <dd><p>
507 Nothing.
508 </p></dd>
509 </dl>
510 </div>
511 <p>
512 </p>
513 <h5>
514 <a name="recursive_mutex_unlock_bridgehead"></a>
515 <span><a name="recursive_mutex_unlock"></a></span>
516 <a class="link" href="mutex_types.html#recursive_mutex_unlock">Member
517 function <code class="computeroutput">unlock</code>()</a>
518 </h5>
519 <p>
520 </p>
521 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
522 </pre>
523 <div class="variablelist">
524 <p class="title"><b></b></p>
525 <dl>
526 <dt><span class="term">Effects:</span></dt>
527 <dd><p>
528 Releases a lock on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
529 by the current fiber.
530 </p></dd>
531 <dt><span class="term">Throws:</span></dt>
532 <dd><p>
533 <code class="computeroutput"><span class="identifier">lock_error</span></code>
534 </p></dd>
535 <dt><span class="term">Error Conditions:</span></dt>
536 <dd><p>
537 <span class="bold"><strong>operation_not_permitted</strong></span>: if <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
538 does not own the mutex.
539 </p></dd>
540 </dl>
541 </div>
542 <p>
543 </p>
544 <h5>
545 <a name="class_recursive_timed_mutex_bridgehead"></a>
546 <span><a name="class_recursive_timed_mutex"></a></span>
547 <a class="link" href="mutex_types.html#class_recursive_timed_mutex">Class
548 <code class="computeroutput">recursive_timed_mutex</code></a>
549 </h5>
550 <p>
551 </p>
552 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">recursive_timed_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
553
554 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
555 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
556
557 <span class="keyword">class</span> <span class="identifier">recursive_timed_mutex</span> <span class="special">{</span>
558 <span class="keyword">public</span><span class="special">:</span>
559 <span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
560 <span class="special">~</span><span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
561
562 <span class="identifier">recursive_timed_mutex</span><span class="special">(</span> <span class="identifier">recursive_timed_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
563 <span class="identifier">recursive_timed_mutex</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">recursive_timed_mutex</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
564
565 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
566 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
567 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
568
569 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
570 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
571 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
572 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
573 <span class="special">};</span>
574
575 <span class="special">}}</span>
576 </pre>
577 <p>
578 <a class="link" href="mutex_types.html#class_recursive_timed_mutex"><code class="computeroutput">recursive_timed_mutex</code></a> provides an exclusive-ownership
579 recursive mutex. At most one fiber can own the lock on a given instance of
580 <a class="link" href="mutex_types.html#class_recursive_timed_mutex"><code class="computeroutput">recursive_timed_mutex</code></a> at any time. Multiple concurrent
581 calls to <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>,
582 <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>,
583 <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code>,
584 <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code>
585 and <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
586 shall be permitted. A fiber that already has exclusive ownership of a given
587 <a class="link" href="mutex_types.html#class_recursive_timed_mutex"><code class="computeroutput">recursive_timed_mutex</code></a> instance can call <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>,
588 <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>,
589 <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code>
590 or <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code>
591 to acquire an additional level of ownership of the mutex. <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> must be called once for each level of ownership
592 acquired by a single fiber before ownership can be acquired by another fiber.
593 </p>
594 <p>
595 </p>
596 <h5>
597 <a name="recursive_timed_mutex_lock_bridgehead"></a>
598 <span><a name="recursive_timed_mutex_lock"></a></span>
599 <a class="link" href="mutex_types.html#recursive_timed_mutex_lock">Member
600 function <code class="computeroutput">lock</code>()</a>
601 </h5>
602 <p>
603 </p>
604 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
605 </pre>
606 <div class="variablelist">
607 <p class="title"><b></b></p>
608 <dl>
609 <dt><span class="term">Effects:</span></dt>
610 <dd><p>
611 The current fiber blocks until ownership can be obtained.
612 </p></dd>
613 <dt><span class="term">Throws:</span></dt>
614 <dd><p>
615 Nothing
616 </p></dd>
617 </dl>
618 </div>
619 <p>
620 </p>
621 <h5>
622 <a name="recursive_timed_mutex_try_lock_bridgehead"></a>
623 <span><a name="recursive_timed_mutex_try_lock"></a></span>
624 <a class="link" href="mutex_types.html#recursive_timed_mutex_try_lock">Member
625 function <code class="computeroutput">try_lock</code>()</a>
626 </h5>
627 <p>
628 </p>
629 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
630 </pre>
631 <div class="variablelist">
632 <p class="title"><b></b></p>
633 <dl>
634 <dt><span class="term">Effects:</span></dt>
635 <dd><p>
636 Attempt to obtain ownership for the current fiber without blocking.
637 </p></dd>
638 <dt><span class="term">Returns:</span></dt>
639 <dd><p>
640 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
641 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
642 otherwise.
643 </p></dd>
644 <dt><span class="term">Throws:</span></dt>
645 <dd><p>
646 Nothing.
647 </p></dd>
648 </dl>
649 </div>
650 <p>
651 </p>
652 <h5>
653 <a name="recursive_timed_mutex_unlock_bridgehead"></a>
654 <span><a name="recursive_timed_mutex_unlock"></a></span>
655 <a class="link" href="mutex_types.html#recursive_timed_mutex_unlock">Member
656 function <code class="computeroutput">unlock</code>()</a>
657 </h5>
658 <p>
659 </p>
660 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
661 </pre>
662 <div class="variablelist">
663 <p class="title"><b></b></p>
664 <dl>
665 <dt><span class="term">Effects:</span></dt>
666 <dd><p>
667 Releases a lock on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
668 by the current fiber.
669 </p></dd>
670 <dt><span class="term">Throws:</span></dt>
671 <dd><p>
672 <code class="computeroutput"><span class="identifier">lock_error</span></code>
673 </p></dd>
674 <dt><span class="term">Error Conditions:</span></dt>
675 <dd><p>
676 <span class="bold"><strong>operation_not_permitted</strong></span>: if <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_fiber</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code>
677 does not own the mutex.
678 </p></dd>
679 </dl>
680 </div>
681 <p>
682 </p>
683 <h5>
684 <a name="recursive_timed_mutex_try_lock_until_bridgehead"></a>
685 <span><a name="recursive_timed_mutex_try_lock_until"></a></span>
686 <a class="link" href="mutex_types.html#recursive_timed_mutex_try_lock_until">Templated
687 member function <code class="computeroutput">try_lock_until</code>()</a>
688 </h5>
689 <p>
690 </p>
691 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
692 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
693 </pre>
694 <div class="variablelist">
695 <p class="title"><b></b></p>
696 <dl>
697 <dt><span class="term">Effects:</span></dt>
698 <dd><p>
699 Attempt to obtain ownership for the current fiber. Blocks until ownership
700 can be obtained, or the specified time is reached. If the specified
701 time has already passed, behaves as <a class="link" href="mutex_types.html#recursive_timed_mutex_try_lock"><code class="computeroutput">recursive_timed_mutex::try_lock()</code></a>.
702 </p></dd>
703 <dt><span class="term">Returns:</span></dt>
704 <dd><p>
705 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
706 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
707 otherwise.
708 </p></dd>
709 <dt><span class="term">Throws:</span></dt>
710 <dd><p>
711 Timeout-related exceptions.
712 </p></dd>
713 </dl>
714 </div>
715 <p>
716 </p>
717 <h5>
718 <a name="recursive_timed_mutex_try_lock_for_bridgehead"></a>
719 <span><a name="recursive_timed_mutex_try_lock_for"></a></span>
720 <a class="link" href="mutex_types.html#recursive_timed_mutex_try_lock_for">Templated
721 member function <code class="computeroutput">try_lock_for</code>()</a>
722 </h5>
723 <p>
724 </p>
725 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
726 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
727 </pre>
728 <div class="variablelist">
729 <p class="title"><b></b></p>
730 <dl>
731 <dt><span class="term">Effects:</span></dt>
732 <dd><p>
733 Attempt to obtain ownership for the current fiber. Blocks until ownership
734 can be obtained, or the specified time is reached. If the specified
735 time has already passed, behaves as <a class="link" href="mutex_types.html#recursive_timed_mutex_try_lock"><code class="computeroutput">recursive_timed_mutex::try_lock()</code></a>.
736 </p></dd>
737 <dt><span class="term">Returns:</span></dt>
738 <dd><p>
739 <code class="computeroutput"><span class="keyword">true</span></code> if ownership was
740 obtained for the current fiber, <code class="computeroutput"><span class="keyword">false</span></code>
741 otherwise.
742 </p></dd>
743 <dt><span class="term">Throws:</span></dt>
744 <dd><p>
745 Timeout-related exceptions.
746 </p></dd>
747 </dl>
748 </div>
749 </div>
750 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
751 <td align="left"></td>
752 <td align="right"><div class="copyright-footer">Copyright &#169; 2013 Oliver Kowalke<p>
753 Distributed under the Boost Software License, Version 1.0. (See accompanying
754 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>)
755 </p>
756 </div></td>
757 </tr></table>
758 <hr>
759 <div class="spirit-nav">
760 <a accesskey="p" href="../synchronization.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../synchronization.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="conditions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
761 </div>
762 </body>
763 </html>