• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
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.79.1">
7<link rel="home" href="../../index.html" title="Chapter 1. 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 class="phrase"><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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 class="phrase"><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 class="variablelist">
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 © 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>
764