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"><</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">></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">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">mutex</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 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"><</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">></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">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">timed_mutex</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 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"><</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">></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"><</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout_time</span><span class="special">);</span> 203 <span class="keyword">template</span><span class="special"><</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">></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"><</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</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">></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"><</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</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">></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"><</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</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">></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">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">recursive_mutex</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 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"><</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">></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">&</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">&</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">&</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"><</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">></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"><</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout_time</span><span class="special">);</span> 571 <span class="keyword">template</span><span class="special"><</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">></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"><</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</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">></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"><</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</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">></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"><</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">></span> <span class="keyword">const</span><span class="special">&</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