1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Synchronized Data Structures</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../thread.html" title="Chapter 39. Thread 4.8.0"> 10<link rel="prev" href="thread_local_storage.html" title="Thread Local Storage"> 11<link rel="next" href="parallel.html" title="Parallel - Fork-Join -- EXPERIMENTAL"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="thread_local_storage.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="parallel.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="thread.sds"></a><a class="link" href="sds.html" title="Synchronized Data Structures">Synchronized Data Structures</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx">Synchronized Values 32 - EXPERIMENTAL</a></span></dt> 33<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues">Synchronized Queues -- 34 EXPERIMENTAL</a></span></dt> 35</dl></div> 36<div class="section"> 37<div class="titlepage"><div><div><h3 class="title"> 38<a name="thread.sds.synchronized_valuesxxx"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx" title="Synchronized Values - EXPERIMENTAL">Synchronized Values 39 - EXPERIMENTAL</a> 40</h3></div></div></div> 41<div class="toc"><dl class="toc"> 42<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.tutorial">Tutorial</a></span></dt> 43<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref">Reference 44 </a></span></dt> 45</dl></div> 46<div class="warning"><table border="0" summary="Warning"> 47<tr> 48<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 49<th align="left">Warning</th> 50</tr> 51<tr><td align="left" valign="top"><p> 52 These features are experimental and subject to change in future versions. 53 There are not too much tests yet, so it is possible that you can find out 54 some trivial bugs :( 55 </p></td></tr> 56</table></div> 57<div class="section"> 58<div class="titlepage"><div><div><h4 class="title"> 59<a name="thread.sds.synchronized_valuesxxx.tutorial"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.tutorial" title="Tutorial">Tutorial</a> 60</h4></div></div></div> 61<div class="toc"><dl class="toc"> 62<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.the_problem_with_mutexes">The 63 Problem with Mutexes</a></span></dt> 64<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.beyond_simple_accesses">Beyond 65 Simple Accesses</a></span></dt> 66<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.operations_across_multiple_objects">Operations 67 Across Multiple Objects</a></span></dt> 68<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.value_semantics">Value 69 semantics</a></span></dt> 70</dl></div> 71<div class="note"><table border="0" summary="Note"> 72<tr> 73<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 74<th align="left">Note</th> 75</tr> 76<tr><td align="left" valign="top"><p> 77 This tutorial is an adaptation of the paper of Anthony Williams "Enforcing 78 Correct Mutex Usage with Synchronized Values" to the Boost library. 79 </p></td></tr> 80</table></div> 81<div class="section"> 82<div class="titlepage"><div><div><h5 class="title"> 83<a name="thread.sds.synchronized_valuesxxx.tutorial.the_problem_with_mutexes"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.the_problem_with_mutexes" title="The Problem with Mutexes">The 84 Problem with Mutexes</a> 85</h5></div></div></div> 86<p> 87 The key problem with protecting shared data with a mutex is that there 88 is no easy way to associate the mutex with the data. It is thus relatively 89 easy to accidentally write code that fails to lock the right mutex - 90 or even locks the wrong mutex - and the compiler will not help you. 91 </p> 92<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m1</span><span class="special">;</span> 93<span class="keyword">int</span> <span class="identifier">value1</span><span class="special">;</span> 94<span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m2</span><span class="special">;</span> 95<span class="keyword">int</span> <span class="identifier">value2</span><span class="special">;</span> 96 97<span class="keyword">int</span> <span class="identifier">readValue1</span><span class="special">()</span> 98<span class="special">{</span> 99 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m1</span><span class="special">);</span> 100 <span class="keyword">return</span> <span class="identifier">value1</span><span class="special">;</span> 101<span class="special">}</span> 102<span class="keyword">int</span> <span class="identifier">readValue2</span><span class="special">()</span> 103<span class="special">{</span> 104 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m1</span><span class="special">);</span> <span class="comment">// oops: wrong mutex</span> 105 <span class="keyword">return</span> <span class="identifier">value2</span><span class="special">;</span> 106<span class="special">}</span> 107</pre> 108<p> 109 Moreover, managing the mutex lock also clutters the source code, making 110 it harder to see what is really going on. 111 </p> 112<p> 113 The use of synchronized_value solves both these problems - the mutex 114 is intimately tied to the value, so you cannot access it without a lock, 115 and yet access semantics are still straightforward. For simple accesses, 116 synchronized_value behaves like a pointer-to-T; for example: 117 </p> 118<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">value3</span><span class="special">;</span> 119<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">readValue3</span><span class="special">()</span> 120<span class="special">{</span> 121 <span class="keyword">return</span> <span class="special">*</span><span class="identifier">value3</span><span class="special">;</span> 122<span class="special">}</span> 123<span class="keyword">void</span> <span class="identifier">setValue3</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">newVal</span><span class="special">)</span> 124<span class="special">{</span> 125 <span class="special">*</span><span class="identifier">value3</span><span class="special">=</span><span class="identifier">newVal</span><span class="special">;</span> 126<span class="special">}</span> 127<span class="keyword">void</span> <span class="identifier">appendToValue3</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">extra</span><span class="special">)</span> 128<span class="special">{</span> 129 <span class="identifier">value3</span><span class="special">-></span><span class="identifier">append</span><span class="special">(</span><span class="identifier">extra</span><span class="special">);</span> 130<span class="special">}</span> 131</pre> 132<p> 133 Both forms of pointer dereference return a proxy object rather than a 134 real reference, to ensure that the lock on the mutex is held across the 135 assignment or method call, but this is transparent to the user. 136 </p> 137</div> 138<div class="section"> 139<div class="titlepage"><div><div><h5 class="title"> 140<a name="thread.sds.synchronized_valuesxxx.tutorial.beyond_simple_accesses"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.beyond_simple_accesses" title="Beyond Simple Accesses">Beyond 141 Simple Accesses</a> 142</h5></div></div></div> 143<p> 144 The pointer-like semantics work very well for simple accesses such as 145 assignment and calls to member functions. However, sometimes you need 146 to perform an operation that requires multiple accesses under protection 147 of the same lock, and that's what the synchronize() method provides. 148 </p> 149<p> 150 By calling synchronize() you obtain a strict_lock_ptr object that holds 151 a lock on the mutex protecting the data, and which can be used to access 152 the protected data. The lock is held until the strict_lock_ptr object 153 is destroyed, so you can safely perform multi-part operations. The strict_lock_ptr 154 object also acts as a pointer-to-T, just like synchronized_value does, 155 but this time the lock is already held. For example, the following function 156 adds a trailing slash to a path held in a synchronized_value. The use 157 of the strict_lock_ptr object ensures that the string hasn't changed 158 in between the query and the update. 159 </p> 160<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">addTrailingSlashIfMissing</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="special">&</span> <span class="identifier">path</span><span class="special">)</span> 161<span class="special">{</span> 162 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">u</span><span class="special">=</span><span class="identifier">path</span><span class="special">.</span><span class="identifier">synchronize</span><span class="special">();</span> 163 164 <span class="keyword">if</span><span class="special">(</span><span class="identifier">u</span><span class="special">-></span><span class="identifier">empty</span><span class="special">()</span> <span class="special">||</span> <span class="special">(*</span><span class="identifier">u</span><span class="special">-></span><span class="identifier">rbegin</span><span class="special">()!=</span><span class="char">'/'</span><span class="special">))</span> 165 <span class="special">{</span> 166 <span class="special">*</span><span class="identifier">u</span><span class="special">+=</span><span class="char">'/'</span><span class="special">;</span> 167 <span class="special">}</span> 168<span class="special">}</span> 169</pre> 170</div> 171<div class="section"> 172<div class="titlepage"><div><div><h5 class="title"> 173<a name="thread.sds.synchronized_valuesxxx.tutorial.operations_across_multiple_objects"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.operations_across_multiple_objects" title="Operations Across Multiple Objects">Operations 174 Across Multiple Objects</a> 175</h5></div></div></div> 176<p> 177 Though synchronized_value works very well for protecting a single object 178 of type T, nothing that we've seen so far solves the problem of operations 179 that require atomic access to multiple objects unless those objects can 180 be combined within a single structure protected by a single mutex. 181 </p> 182<p> 183 One way to protect access to two synchronized_value objects is to construct 184 a strict_lock_ptr for each object and use those to access the respective 185 protected values; for instance: 186 </p> 187<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">q1</span><span class="special">,</span><span class="identifier">q2</span><span class="special">;</span> 188<span class="keyword">void</span> <span class="identifier">transferMessage</span><span class="special">()</span> 189<span class="special">{</span> 190 <span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">u1</span> <span class="special">=</span> <span class="identifier">q1</span><span class="special">.</span><span class="identifier">synchronize</span><span class="special">();</span> 191 <span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">u2</span> <span class="special">=</span> <span class="identifier">q2</span><span class="special">.</span><span class="identifier">synchronize</span><span class="special">();</span> 192 193 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">u1</span><span class="special">-></span><span class="identifier">empty</span><span class="special">())</span> 194 <span class="special">{</span> 195 <span class="identifier">u2</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-></span><span class="identifier">front</span><span class="special">());</span> 196 <span class="identifier">u1</span><span class="special">-></span><span class="identifier">pop_front</span><span class="special">();</span> 197 <span class="special">}</span> 198<span class="special">}</span> 199</pre> 200<p> 201 This works well in some scenarios, but not all -- if the same two objects 202 are updated together in different sections of code then you need to take 203 care to ensure that the strict_lock_ptr objects are constructed in the 204 same sequence in all cases, otherwise you have the potential for deadlock. 205 This is just the same as when acquiring any two mutexes. 206 </p> 207<p> 208 In order to be able to use the dead-lock free lock algorithms we need 209 to use instead unique_lock_ptr, which is Lockable. 210 </p> 211<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">q1</span><span class="special">,</span><span class="identifier">q2</span><span class="special">;</span> 212<span class="keyword">void</span> <span class="identifier">transferMessage</span><span class="special">()</span> 213<span class="special">{</span> 214 <span class="identifier">unique_lock_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">u1</span> <span class="special">=</span> <span class="identifier">q1</span><span class="special">.</span><span class="identifier">unique_synchronize</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock</span><span class="special">);</span> 215 <span class="identifier">unique_lock_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">u2</span> <span class="special">=</span> <span class="identifier">q2</span><span class="special">.</span><span class="identifier">unique_synchronize</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock</span><span class="special">);</span> 216 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock</span><span class="special">(</span><span class="identifier">u1</span><span class="special">,</span><span class="identifier">u2</span><span class="special">);</span> <span class="comment">// dead-lock free algorithm</span> 217 218 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">u1</span><span class="special">-></span><span class="identifier">empty</span><span class="special">())</span> 219 <span class="special">{</span> 220 <span class="identifier">u2</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-></span><span class="identifier">front</span><span class="special">());</span> 221 <span class="identifier">u1</span><span class="special">-></span><span class="identifier">pop_front</span><span class="special">();</span> 222 <span class="special">}</span> 223<span class="special">}</span> 224</pre> 225<p> 226 While the preceding takes care of dead-lock, the access to the synchronized_value 227 via unique_lock_ptr requires a lock that is not forced by the interface. 228 An alternative on compilers providing a standard library that supports 229 movable std::tuple is to use the free synchronize function, which will 230 lock all the mutexes associated to the synchronized values and return 231 a tuple os strict_lock_ptr. 232 </p> 233<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="identifier">MessageType</span><span class="special">></span> <span class="special">></span> <span class="identifier">q1</span><span class="special">,</span><span class="identifier">q2</span><span class="special">;</span> 234<span class="keyword">void</span> <span class="identifier">transferMessage</span><span class="special">()</span> 235<span class="special">{</span> 236 <span class="keyword">auto</span> <span class="identifier">lks</span> <span class="special">=</span> <span class="identifier">synchronize</span><span class="special">(</span><span class="identifier">u1</span><span class="special">,</span><span class="identifier">u2</span><span class="special">);</span> <span class="comment">// dead-lock free algorithm</span> 237 238 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="number">1</span><span class="special">>(</span><span class="identifier">lks</span><span class="special">)-></span><span class="identifier">empty</span><span class="special">())</span> 239 <span class="special">{</span> 240 <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">lks</span><span class="special">)-></span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-></span><span class="identifier">front</span><span class="special">());</span> 241 <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="number">1</span><span class="special">>(</span><span class="identifier">lks</span><span class="special">)-></span><span class="identifier">pop_front</span><span class="special">();</span> 242 <span class="special">}</span> 243<span class="special">}</span> 244</pre> 245</div> 246<div class="section"> 247<div class="titlepage"><div><div><h5 class="title"> 248<a name="thread.sds.synchronized_valuesxxx.tutorial.value_semantics"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.tutorial.value_semantics" title="Value semantics">Value 249 semantics</a> 250</h5></div></div></div> 251<p> 252 synchronized_value has value semantics even if the syntax lets is close 253 to a pointer (this is just because we are unable to define smart references). 254 </p> 255</div> 256</div> 257<div class="section"> 258<div class="titlepage"><div><div><h4 class="title"> 259<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref" title="Reference">Reference 260 </a> 261</h4></div></div></div> 262<div class="toc"><dl class="toc"> 263<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value">Class 264 <code class="computeroutput"><span class="identifier">synchronized_value</span></code></a></span></dt> 265<dt><span class="section"><a href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronize">Non-Member 266 Function <code class="computeroutput"><span class="identifier">synchronize</span></code></a></span></dt> 267</dl></div> 268<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">synchronized_value</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 269<span class="keyword">namespace</span> <span class="identifier">boost</span> 270<span class="special">{</span> 271 272 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 273 <span class="keyword">class</span> <span class="identifier">synchronized_value</span><span class="special">;</span> 274 275 <span class="comment">// Specialized swap algorithm</span> 276 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 277 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 278 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 279 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 280 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 281 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 282 283 <span class="comment">// Hash support</span> 284 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 285 <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special"><</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="special">>;</span> 286 287 <span class="comment">// Comparison</span> 288 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 289 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 290 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 291 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 292 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 293 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 294 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 295 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 296 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 297 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 298 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 299 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 300 301 <span class="comment">// Comparison with T</span> 302 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 303 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 304 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 305 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 306 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 307 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 308 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 309 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 310 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 311 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 312 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 313 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">);</span> 314 315 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 316 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 317 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 318 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 319 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 320 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 321 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 322 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 323 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 324 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 325 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 326 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 327 328<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_NO_SYNCHRONIZE</span><span class="special">)</span> 329 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">SV</span><span class="special">></span> 330 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">synchronized_value_strict_lock_ptr</span><span class="special"><</span><span class="identifier">SV</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">...></span> <span class="identifier">synchronize</span><span class="special">(</span><span class="identifier">SV</span><span class="special">&</span> <span class="special">...</span><span class="identifier">sv</span><span class="special">);</span> 331<span class="preprocessor">#endif</span> 332<span class="special">}</span> 333</pre> 334<div class="section"> 335<div class="titlepage"><div><div><h5 class="title"> 336<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value" title="Class synchronized_value">Class 337 <code class="computeroutput"><span class="identifier">synchronized_value</span></code></a> 338</h5></div></div></div> 339<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">synchronized_value</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 340 341<span class="keyword">namespace</span> <span class="identifier">boost</span> 342<span class="special">{</span> 343 344 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 345 <span class="keyword">class</span> <span class="identifier">synchronized_value</span> 346 <span class="special">{</span> 347 <span class="keyword">public</span><span class="special">:</span> 348 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span> 349 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 350 351 <span class="identifier">synchronized_value</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_default_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 352 <span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_copy_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 353 <span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 354 <span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 355 <span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 356 357 <span class="comment">// mutation</span> 358 <span class="identifier">synchronized_value</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 359 <span class="identifier">synchronized_value</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">);</span> 360 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 361 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">value_type</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 362 363 <span class="comment">//observers</span> 364 <span class="identifier">T</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 365 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS</span><span class="special">)</span> 366 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="identifier">T</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 367 <span class="preprocessor">#endif</span> 368 369 <span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">operator</span><span class="special">->();</span> 370 <span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span> 371 <span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">synchronize</span><span class="special">();</span> 372 <span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">synchronize</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 373 374 <span class="identifier">deref_value</span> <span class="keyword">operator</span><span class="special">*();;</span> 375 <span class="identifier">const_deref_value</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 376 377 <span class="keyword">private</span><span class="special">:</span> 378 <span class="identifier">T</span> <span class="identifier">value_</span><span class="special">;</span> <span class="comment">// for exposition only</span> 379 <span class="keyword">mutable</span> <span class="identifier">mutex_type</span> <span class="identifier">mtx_</span><span class="special">;</span> <span class="comment">// for exposition only</span> 380 <span class="special">};</span> 381<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">Requires:</span></dt> 387<dd><p> 388 <code class="computeroutput"><span class="identifier">Lockable</span></code> is <code class="computeroutput"><span class="identifier">Lockable</span></code>. 389 </p></dd> 390</dl> 391</div> 392<div class="section"> 393<div class="titlepage"><div><div><h6 class="title"> 394<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.constructor"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.constructor" title="synchronized_value()"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">()</span></code></a> 395</h6></div></div></div> 396<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_default_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 397</pre> 398<div class="variablelist"> 399<p class="title"><b></b></p> 400<dl class="variablelist"> 401<dt><span class="term">Requires:</span></dt> 402<dd><p> 403 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">DefaultConstructible</span></code>. 404 </p></dd> 405<dt><span class="term">Effects:</span></dt> 406<dd><p> 407 Default constructs the cloaked value_type 408 </p></dd> 409<dt><span class="term">Throws:</span></dt> 410<dd><p> 411 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">()</span></code>. 412 </p></dd> 413</dl> 414</div> 415</div> 416<div class="section"> 417<div class="titlepage"><div><div><h6 class="title"> 418<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.constructor_vt"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.constructor_vt" title="synchronized_value(T const&)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span></code></a> 419</h6></div></div></div> 420<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_copy_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 421</pre> 422<div class="variablelist"> 423<p class="title"><b></b></p> 424<dl class="variablelist"> 425<dt><span class="term">Requires:</span></dt> 426<dd><p> 427 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>. 428 </p></dd> 429<dt><span class="term">Effects:</span></dt> 430<dd><p> 431 Copy constructs the cloaked value_type using the parameter <code class="computeroutput"><span class="identifier">other</span></code> 432 </p></dd> 433<dt><span class="term">Throws:</span></dt> 434<dd><p> 435 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">(</span><span class="identifier">other</span><span class="special">)</span></code>. 436 </p></dd> 437</dl> 438</div> 439</div> 440<div class="section"> 441<div class="titlepage"><div><div><h6 class="title"> 442<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.copy_cons"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.copy_cons" title="synchronized_value(synchronized_value const&)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&)</span></code></a> 443</h6></div></div></div> 444<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 445</pre> 446<div class="variablelist"> 447<p class="title"><b></b></p> 448<dl class="variablelist"> 449<dt><span class="term">Requires:</span></dt> 450<dd><p> 451 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">DefaultConstructible</span></code> and <code class="computeroutput"><span class="identifier">Assignable</span></code>. 452 </p></dd> 453<dt><span class="term">Effects:</span></dt> 454<dd><p> 455 Assigns the value on a scope protected by the mutex of the rhs. 456 The mutex is not copied. 457 </p></dd> 458<dt><span class="term">Throws:</span></dt> 459<dd><p> 460 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">value_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span><span class="special">&)</span></code> or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 461 </p></dd> 462</dl> 463</div> 464</div> 465<div class="section"> 466<div class="titlepage"><div><div><h6 class="title"> 467<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.move_vt"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.move_vt" title="synchronized_value(T&&)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&)</span></code></a> 468</h6></div></div></div> 469<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">is_nothrow_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span> 470</pre> 471<div class="variablelist"> 472<p class="title"><b></b></p> 473<dl class="variablelist"> 474<dt><span class="term">Requires:</span></dt> 475<dd><p> 476 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">MoveConstructible</span> </code>. 477 </p></dd> 478<dt><span class="term">Effects:</span></dt> 479<dd><p> 480 Move constructs the cloaked value_type 481 </p></dd> 482<dt><span class="term">Throws:</span></dt> 483<dd><p> 484 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&)</span></code>. 485 </p></dd> 486</dl> 487</div> 488</div> 489<div class="section"> 490<div class="titlepage"><div><div><h6 class="title"> 491<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.move"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.move" title="synchronized_value(synchronized_value&&)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&&)</span></code></a> 492</h6></div></div></div> 493<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 494</pre> 495<div class="variablelist"> 496<p class="title"><b></b></p> 497<dl class="variablelist"> 498<dt><span class="term">Requires:</span></dt> 499<dd><p> 500 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">MoveConstructible</span> </code>. 501 </p></dd> 502<dt><span class="term">Effects:</span></dt> 503<dd><p> 504 Move constructs the cloaked value_type 505 </p></dd> 506<dt><span class="term">Throws:</span></dt> 507<dd><p> 508 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&)</span></code> or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 509 </p></dd> 510</dl> 511</div> 512</div> 513<div class="section"> 514<div class="titlepage"><div><div><h6 class="title"> 515<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.assign"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.assign" title="operator=(synchronized_value const&)"><code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&)</span></code></a> 516</h6></div></div></div> 517<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 518</pre> 519<div class="variablelist"> 520<p class="title"><b></b></p> 521<dl class="variablelist"> 522<dt><span class="term">Requires:</span></dt> 523<dd><p> 524 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">Assignable</span></code>. 525 </p></dd> 526<dt><span class="term">Effects:</span></dt> 527<dd><p> 528 Copies the underlying value on a scope protected by the two mutexes. 529 The mutex is not copied. The locks are acquired avoiding deadlock. 530 For example, there is no problem if one thread assigns <code class="computeroutput"><span class="identifier">a</span> <span class="special">=</span> 531 <span class="identifier">b</span></code> and the other assigns 532 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> 533 <span class="identifier">a</span></code>. 534 </p></dd> 535<dt><span class="term">Return:</span></dt> 536<dd><p> 537 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 538 </p></dd> 539<dt><span class="term">Throws:</span></dt> 540<dd><p> 541 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">(</span><span class="identifier">value_type</span> 542 <span class="keyword">const</span><span class="special">&)</span></code> 543 or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 544 </p></dd> 545</dl> 546</div> 547</div> 548<div class="section"> 549<div class="titlepage"><div><div><h6 class="title"> 550<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.assign_vt"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.assign_vt" title="operator=(T const&)"><code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span></code></a> 551</h6></div></div></div> 552<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">);</span> 553</pre> 554<div class="variablelist"> 555<p class="title"><b></b></p> 556<dl class="variablelist"> 557<dt><span class="term">Requires:</span></dt> 558<dd><p> 559 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">Assignable</span></code>. 560 </p></dd> 561<dt><span class="term">Effects:</span></dt> 562<dd><p> 563 Copies the value on a scope protected by the mutex. 564 </p></dd> 565<dt><span class="term">Return:</span></dt> 566<dd><p> 567 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 568 </p></dd> 569<dt><span class="term">Throws:</span></dt> 570<dd><p> 571 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">(</span><span class="identifier">value_type</span> 572 <span class="keyword">const</span><span class="special">&)</span></code> 573 or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 574 </p></dd> 575</dl> 576</div> 577</div> 578<div class="section"> 579<div class="titlepage"><div><div><h6 class="title"> 580<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.get"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.get" title="get() const"><code class="computeroutput"><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span></code></a> 581</h6></div></div></div> 582<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 583</pre> 584<div class="variablelist"> 585<p class="title"><b></b></p> 586<dl class="variablelist"> 587<dt><span class="term">Requires:</span></dt> 588<dd><p> 589 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>. 590 </p></dd> 591<dt><span class="term">Return:</span></dt> 592<dd><p> 593 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">copy</span> 594 <span class="identifier">of</span> <span class="identifier">the</span> 595 <span class="keyword">protected</span> <span class="identifier">value</span> 596 <span class="identifier">obtained</span> <span class="identifier">on</span> 597 <span class="identifier">a</span> <span class="identifier">scope</span> 598 <span class="keyword">protected</span> <span class="identifier">by</span> 599 <span class="identifier">the</span> <span class="identifier">mutex</span><span class="special">.</span></code> 600 </p></dd> 601<dt><span class="term">Throws:</span></dt> 602<dd><p> 603 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">(</span><span class="identifier">value_type</span> 604 <span class="keyword">const</span><span class="special">&)</span></code> 605 or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 606 </p></dd> 607</dl> 608</div> 609</div> 610<div class="section"> 611<div class="titlepage"><div><div><h6 class="title"> 612<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.T"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.T" title="operator T() const"><code class="computeroutput"><span class="keyword">operator</span> <span class="identifier">T</span><span class="special">()</span> <span class="keyword">const</span></code></a> 613</h6></div></div></div> 614<pre class="programlisting"><span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS</span><span class="special">)</span> 615 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="identifier">T</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 616<span class="preprocessor">#endif</span> 617</pre> 618<div class="variablelist"> 619<p class="title"><b></b></p> 620<dl class="variablelist"> 621<dt><span class="term">Requires:</span></dt> 622<dd><p> 623 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>. 624 </p></dd> 625<dt><span class="term">Return:</span></dt> 626<dd><p> 627 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">copy</span> 628 <span class="identifier">of</span> <span class="identifier">the</span> 629 <span class="keyword">protected</span> <span class="identifier">value</span> 630 <span class="identifier">obtained</span> <span class="identifier">on</span> 631 <span class="identifier">a</span> <span class="identifier">scope</span> 632 <span class="keyword">protected</span> <span class="identifier">by</span> 633 <span class="identifier">the</span> <span class="identifier">mutex</span><span class="special">.</span></code> 634 </p></dd> 635<dt><span class="term">Throws:</span></dt> 636<dd><p> 637 Any exception thrown by <code class="computeroutput"><span class="identifier">value_type</span><span class="special">(</span><span class="identifier">value_type</span> 638 <span class="keyword">const</span><span class="special">&)</span></code> 639 or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 640 </p></dd> 641</dl> 642</div> 643</div> 644<div class="section"> 645<div class="titlepage"><div><div><h6 class="title"> 646<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.swap"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.swap" title="swap(synchronized_value&)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&)</span></code></a> 647</h6></div></div></div> 648<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 649</pre> 650<div class="variablelist"> 651<p class="title"><b></b></p> 652<dl class="variablelist"> 653<dt><span class="term">Requires:</span></dt> 654<dd><p> 655 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">Assignable</span></code>. 656 </p></dd> 657<dt><span class="term">Effects:</span></dt> 658<dd><p> 659 Swaps the data on a scope protected by both mutex. Both mutex 660 are acquired to avoid dead-lock. The mutexes are not swapped. 661 </p></dd> 662<dt><span class="term">Throws:</span></dt> 663<dd><p> 664 Any exception thrown by <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">value_</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">value</span><span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">rhs_</span><span class="special">.</span><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 665 </p></dd> 666</dl> 667</div> 668</div> 669<div class="section"> 670<div class="titlepage"><div><div><h6 class="title"> 671<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.swap_vt"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.swap_vt" title="swap(synchronized_value&)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&)</span></code></a> 672</h6></div></div></div> 673<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">value_type</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 674</pre> 675<div class="variablelist"> 676<p class="title"><b></b></p> 677<dl class="variablelist"> 678<dt><span class="term">Requires:</span></dt> 679<dd><p> 680 <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="identifier">Swapable</span></code>. 681 </p></dd> 682<dt><span class="term">Effects:</span></dt> 683<dd><p> 684 Swaps the data on a scope protected by both mutex. Both mutex 685 are acquired to avoid dead-lock. The mutexes are not swapped. 686 </p></dd> 687<dt><span class="term">Throws:</span></dt> 688<dd><p> 689 Any exception thrown by <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">value_</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 690 </p></dd> 691</dl> 692</div> 693</div> 694<div class="section"> 695<div class="titlepage"><div><div><h6 class="title"> 696<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.indir"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.indir" title="operator->()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code></a> 697</h6></div></div></div> 698<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">operator</span><span class="special">->();</span> 699</pre> 700<p> 701 Essentially calling a method <code class="computeroutput"><span class="identifier">obj</span><span class="special">-></span><span class="identifier">foo</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span></code> calls the method <code class="computeroutput"><span class="identifier">foo</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span></code> inside a critical section as long-lived 702 as the call itself. 703 </p> 704<div class="variablelist"> 705<p class="title"><b></b></p> 706<dl class="variablelist"> 707<dt><span class="term">Return:</span></dt> 708<dd><p> 709 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">strict_lock_ptr</span><span class="special"><>.</span></code> 710 </p></dd> 711<dt><span class="term">Throws:</span></dt> 712<dd><p> 713 Nothing. 714 </p></dd> 715</dl> 716</div> 717</div> 718<div class="section"> 719<div class="titlepage"><div><div><h6 class="title"> 720<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.indir_const"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.indir_const" title="operator->() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span> 721 <span class="keyword">const</span></code></a> 722</h6></div></div></div> 723<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span> 724</pre> 725<p> 726 If the <code class="computeroutput"><span class="identifier">synchronized_value</span></code> 727 object involved is const-qualified, then you'll only be able to call 728 const methods through <code class="computeroutput"><span class="keyword">operator</span><span class="special">-></span></code>. So, for example, <code class="computeroutput"><span class="identifier">vec</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="string">"xyz"</span><span class="special">)</span></code> 729 won't work if <code class="computeroutput"><span class="identifier">vec</span></code> were 730 const-qualified. The locking mechanism capitalizes on the assumption 731 that const methods don't modify their underlying data. 732 </p> 733<div class="variablelist"> 734<p class="title"><b></b></p> 735<dl class="variablelist"> 736<dt><span class="term">Return:</span></dt> 737<dd><p> 738 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">const_strict_lock_ptr</span> 739 <span class="special"><>.</span></code> 740 </p></dd> 741<dt><span class="term">Throws:</span></dt> 742<dd><p> 743 Nothing. 744 </p></dd> 745</dl> 746</div> 747</div> 748<div class="section"> 749<div class="titlepage"><div><div><h6 class="title"> 750<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.synchronize"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.synchronize" title="synchronize()"><code class="computeroutput"><span class="identifier">synchronize</span><span class="special">()</span></code></a> 751</h6></div></div></div> 752<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">synchronize</span><span class="special">();</span> 753</pre> 754<p> 755 The synchronize() factory make easier to lock on a scope. As discussed, 756 <code class="computeroutput"><span class="keyword">operator</span><span class="special">-></span></code> 757 can only lock over the duration of a call, so it is insufficient for 758 complex operations. With <code class="computeroutput"><span class="identifier">synchronize</span><span class="special">()</span></code> you get to lock the object in a scoped 759 and to directly access the object inside that scope. 760 </p> 761<p> 762 <span class="bold"><strong>Example:</strong></span> 763 </p> 764<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>></span> <span class="special">&</span> <span class="identifier">vec</span><span class="special">)</span> <span class="special">{</span> 765 <span class="keyword">auto</span> <span class="identifier">vec2</span><span class="special">=</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">synchronize</span><span class="special">();</span> 766 <span class="identifier">vec2</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">42</span><span class="special">);</span> 767 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">vec2</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="number">42</span><span class="special">);</span> 768<span class="special">}</span> 769</pre> 770<div class="variablelist"> 771<p class="title"><b></b></p> 772<dl class="variablelist"> 773<dt><span class="term">Return:</span></dt> 774<dd><p> 775 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">strict_lock_ptr</span> 776 <span class="special"><>.</span></code> 777 </p></dd> 778<dt><span class="term">Throws:</span></dt> 779<dd><p> 780 Nothing. 781 </p></dd> 782</dl> 783</div> 784</div> 785<div class="section"> 786<div class="titlepage"><div><div><h6 class="title"> 787<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.synchronize_const"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.synchronize_const" title="synchronize() const"><code class="computeroutput"><span class="identifier">synchronize</span><span class="special">()</span> 788 <span class="keyword">const</span></code></a> 789</h6></div></div></div> 790<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">synchronize</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 791</pre> 792<div class="variablelist"> 793<p class="title"><b></b></p> 794<dl class="variablelist"> 795<dt><span class="term">Return:</span></dt> 796<dd><p> 797 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">const_strict_lock_ptr</span> 798 <span class="special"><>.</span></code> 799 </p></dd> 800<dt><span class="term">Throws:</span></dt> 801<dd><p> 802 Nothing. 803 </p></dd> 804</dl> 805</div> 806</div> 807<div class="section"> 808<div class="titlepage"><div><div><h6 class="title"> 809<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.deref"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.deref" title="operator*()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a> 810</h6></div></div></div> 811<pre class="programlisting"><span class="identifier">deref_value</span> <span class="keyword">operator</span><span class="special">*();;</span> 812</pre> 813<div class="variablelist"> 814<p class="title"><b></b></p> 815<dl class="variablelist"> 816<dt><span class="term">Return:</span></dt> 817<dd><p> 818 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">an</span> 819 <span class="identifier">instance</span> <span class="identifier">of</span> 820 <span class="identifier">a</span> <span class="keyword">class</span> 821 <span class="identifier">that</span> <span class="identifier">locks</span> 822 <span class="identifier">the</span> <span class="identifier">mutex</span> 823 <span class="identifier">on</span> <span class="identifier">construction</span> 824 <span class="keyword">and</span> <span class="identifier">unlocks</span> 825 <span class="identifier">it</span> <span class="identifier">on</span> 826 <span class="identifier">destruction</span> <span class="keyword">and</span> 827 <span class="identifier">provides</span> <span class="identifier">implicit</span> 828 <span class="identifier">conversion</span> <span class="identifier">to</span> 829 <span class="identifier">a</span> <span class="identifier">reference</span> 830 <span class="identifier">to</span> <span class="identifier">the</span> 831 <span class="keyword">protected</span> <span class="identifier">value</span><span class="special">.</span></code> 832 </p></dd> 833<dt><span class="term">Throws:</span></dt> 834<dd><p> 835 Nothing. 836 </p></dd> 837</dl> 838</div> 839</div> 840<div class="section"> 841<div class="titlepage"><div><div><h6 class="title"> 842<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.deref_const"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronized_value.deref_const" title="operator*() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span> 843 <span class="keyword">const</span></code></a> 844</h6></div></div></div> 845<pre class="programlisting"><span class="identifier">const_deref_value</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 846</pre> 847<div class="variablelist"> 848<p class="title"><b></b></p> 849<dl class="variablelist"> 850<dt><span class="term">Return:</span></dt> 851<dd><p> 852 <code class="computeroutput"><span class="identifier">A</span> <span class="identifier">an</span> 853 <span class="identifier">instance</span> <span class="identifier">of</span> 854 <span class="identifier">a</span> <span class="keyword">class</span> 855 <span class="identifier">that</span> <span class="identifier">locks</span> 856 <span class="identifier">the</span> <span class="identifier">mutex</span> 857 <span class="identifier">on</span> <span class="identifier">construction</span> 858 <span class="keyword">and</span> <span class="identifier">unlocks</span> 859 <span class="identifier">it</span> <span class="identifier">on</span> 860 <span class="identifier">destruction</span> <span class="keyword">and</span> 861 <span class="identifier">provides</span> <span class="identifier">implicit</span> 862 <span class="identifier">conversion</span> <span class="identifier">to</span> 863 <span class="identifier">a</span> <span class="identifier">constant</span> 864 <span class="identifier">reference</span> <span class="identifier">to</span> 865 <span class="identifier">the</span> <span class="keyword">protected</span> 866 <span class="identifier">value</span><span class="special">.</span></code> 867 </p></dd> 868<dt><span class="term">Throws:</span></dt> 869<dd><p> 870 Nothing. 871 </p></dd> 872</dl> 873</div> 874</div> 875</div> 876<div class="section"> 877<div class="titlepage"><div><div><h5 class="title"> 878<a name="thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronize"></a><a class="link" href="sds.html#thread.sds.synchronized_valuesxxx.synchronized_value_ref.synchronize" title="Non-Member Function synchronize">Non-Member 879 Function <code class="computeroutput"><span class="identifier">synchronize</span></code></a> 880</h5></div></div></div> 881<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">synchronized_value</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 882<span class="keyword">namespace</span> <span class="identifier">boost</span> 883<span class="special">{</span> 884<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_NO_SYNCHRONIZE</span><span class="special">)</span> 885 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">SV</span><span class="special">></span> 886 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">synchronized_value_strict_lock_ptr</span><span class="special"><</span><span class="identifier">SV</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">...></span> <span class="identifier">synchronize</span><span class="special">(</span><span class="identifier">SV</span><span class="special">&</span> <span class="special">...</span><span class="identifier">sv</span><span class="special">);</span> 887<span class="preprocessor">#endif</span> 888<span class="special">}</span> 889</pre> 890</div> 891</div> 892</div> 893<div class="section"> 894<div class="titlepage"><div><div><h3 class="title"> 895<a name="thread.sds.synchronized_queues"></a><a class="link" href="sds.html#thread.sds.synchronized_queues" title="Synchronized Queues -- EXPERIMENTAL">Synchronized Queues -- 896 EXPERIMENTAL</a> 897</h3></div></div></div> 898<div class="toc"><dl class="toc"> 899<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.introduction">Introduction</a></span></dt> 900<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.tutorial">Tutorial</a></span></dt> 901<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.examples">Examples</a></span></dt> 902<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref">Reference</a></span></dt> 903</dl></div> 904<div class="warning"><table border="0" summary="Warning"> 905<tr> 906<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 907<th align="left">Warning</th> 908</tr> 909<tr><td align="left" valign="top"><p> 910 These features are experimental and subject to change in future versions. 911 There are not too much tests yet, so it is possible that you can find out 912 some trivial bugs :( 913 </p></td></tr> 914</table></div> 915<div class="note"><table border="0" summary="Note"> 916<tr> 917<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 918<th align="left">Note</th> 919</tr> 920<tr><td align="left" valign="top"><p> 921 These features are based on the <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3533.html" target="_top"><span class="bold"><strong>N3533 - C++ Concurrent Queues</strong></span></a> C++1y proposal 922 from Lawrence Crowl and Chris Mysen and <a href="http://www.manning.com/williams/" target="_top"><span class="bold"><strong>C++ Concurrency in Action</strong></span></a> from Anthony Williams. 923 </p></td></tr> 924</table></div> 925<div class="section"> 926<div class="titlepage"><div><div><h4 class="title"> 927<a name="thread.sds.synchronized_queues.introduction"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.introduction" title="Introduction">Introduction</a> 928</h4></div></div></div> 929<p> 930 Queues provide a mechanism for communicating data between components of 931 a system. 932 </p> 933<p> 934 The existing deque in the standard library is an inherently sequential 935 data structure. Its reference-returning element access operations cannot 936 synchronize access to those elements with other queue operations. So, concurrent 937 pushes and pops on queues require a different interface to the queue structure. 938 </p> 939<p> 940 Moreover, concurrency adds a new dimension for performance and semantics. 941 Different queue implementation must trade off uncontended operation cost, 942 contended operation cost, and element order guarantees. Some of these trade-offs 943 will necessarily result in semantics weaker than a serial queue. 944 </p> 945</div> 946<div class="section"> 947<div class="titlepage"><div><div><h4 class="title"> 948<a name="thread.sds.synchronized_queues.tutorial"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.tutorial" title="Tutorial">Tutorial</a> 949</h4></div></div></div> 950<p> 951 Concurrent queues are a well know mechanism for communicating data between 952 different threads. 953 </p> 954<p> 955 Concurrent queues have inherently copy/move semantics for the data handling 956 operation. Reference-returning interfaces are forbidden as multiple access 957 to these references can not be thread-safe. 958 </p> 959</div> 960<div class="section"><div class="titlepage"><div><div><h4 class="title"> 961<a name="thread.sds.synchronized_queues.examples"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.examples" title="Examples">Examples</a> 962</h4></div></div></div></div> 963<div class="section"> 964<div class="titlepage"><div><div><h4 class="title"> 965<a name="thread.sds.synchronized_queues.ref"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref" title="Reference">Reference</a> 966</h4></div></div></div> 967<div class="toc"><dl class="toc"> 968<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req">Synchronized 969 Queue Model</a></span></dt> 970<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.queue_op_status">Queue 971 Operation Status</a></span></dt> 972<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.queue_base">Queue 973 Base</a></span></dt> 974<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.queue_adaptor">Queue 975 Adaptor</a></span></dt> 976<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.queue_views">Queue 977 Views</a></span></dt> 978<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref">Synchronized 979 Bounded Queue</a></span></dt> 980<dt><span class="section"><a href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref">Synchronized 981 Unbounded Queue</a></span></dt> 982</dl></div> 983<div class="section"> 984<div class="titlepage"><div><div><h5 class="title"> 985<a name="thread.sds.synchronized_queues.ref.sync_queue_req"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req" title="Synchronized Queue Model">Synchronized 986 Queue Model</a> 987</h5></div></div></div> 988<div class="section"> 989<div class="titlepage"><div><div><h6 class="title"> 990<a name="thread.sds.synchronized_queues.ref.sync_queue_req.bounded_unbounded"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.bounded_unbounded" title="Bounded-Unbounded Queues">Bounded-Unbounded 991 Queues</a> 992</h6></div></div></div> 993<p> 994 One of the major features of a concurrent queue is whether it has a 995 bounded-unbounded capacity. 996 </p> 997</div> 998<div class="section"> 999<div class="titlepage"><div><div><h6 class="title"> 1000<a name="thread.sds.synchronized_queues.ref.sync_queue_req.locking"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.locking" title="Locking/Lock-free Queues">Locking/Lock-free 1001 Queues</a> 1002</h6></div></div></div> 1003<p> 1004 Locking queues can by nature block waiting for the queue to be non-empty 1005 or non-full. 1006 </p> 1007<p> 1008 Lock-free queues will have some trouble waiting for the queue to be 1009 non-empty or non-full queues. These queues can not define operations 1010 such as push (and pull for bounded queues). That is, it could have 1011 blocking operations (presumably emulated with busy wait) but not waiting 1012 operations. 1013 </p> 1014</div> 1015<div class="section"> 1016<div class="titlepage"><div><div><h6 class="title"> 1017<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed" title="Closed Queue">Closed 1018 Queue</a> 1019</h6></div></div></div> 1020<p> 1021 Threads using a queue for communication need some mechanism to signal 1022 when the queue is no longer needed. The usual approach is add an additional 1023 out-of-band signal. However, this approach suffers from the flaw that 1024 threads waiting on either full or empty queues need to be woken up 1025 when the queue is no longer needed. Rather than require an out-of-band 1026 signal, we chose to directly support such a signal in the queue itself, 1027 which considerably simplifies coding. 1028 </p> 1029<p> 1030 To achieve this signal, a thread may close a queue. Once closed, no 1031 new elements may be pushed onto the queue. Push operations on a closed 1032 queue will either return queue_op_status::closed (when they have a 1033 queue_op_status return type), set the closed parameter if it has one 1034 or throw sync_queue::closed (when they do not). Elements already on 1035 the queue may be pulled off. When a queue is empty and closed, pull 1036 operations will either return queue_op_status::closed (when they have 1037 a status return), set the closed parameter if it has one or throw sync_queue::closed 1038 (when they do not). 1039 </p> 1040</div> 1041<div class="section"> 1042<div class="titlepage"><div><div><h6 class="title"> 1043<a name="thread.sds.synchronized_queues.ref.sync_queue_req.exception"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.exception" title="Concurrent Queues Throw specification">Concurrent 1044 Queues Throw specification</a> 1045</h6></div></div></div> 1046<div class="section"> 1047<div class="titlepage"><div><div><h6 class="title"> 1048<a name="thread.sds.synchronized_queues.ref.sync_queue_req.exception.locking"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.exception.locking" title="Locking">Locking</a> 1049</h6></div></div></div> 1050<p> 1051 All the functions are defined as if we had in addition to its specific 1052 Throw specification the following: 1053 </p> 1054<div class="variablelist"> 1055<p class="title"><b></b></p> 1056<dl class="variablelist"> 1057<dt><span class="term">Throws:</span></dt> 1058<dd><p> 1059 Any exception thrown by the internal locking. 1060 </p></dd> 1061</dl> 1062</div> 1063</div> 1064<div class="section"> 1065<div class="titlepage"><div><div><h6 class="title"> 1066<a name="thread.sds.synchronized_queues.ref.sync_queue_req.exception.bad_alloc"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.exception.bad_alloc" title="Allocation">Allocation</a> 1067</h6></div></div></div> 1068<p> 1069 All the functions that allocate a resource are defined as if we had 1070 in addition to its specific Throw specification the following: 1071 </p> 1072<div class="variablelist"> 1073<p class="title"><b></b></p> 1074<dl class="variablelist"> 1075<dt><span class="term">Throws:</span></dt> 1076<dd><p> 1077 Any exception due to allocation errors. 1078 </p></dd> 1079</dl> 1080</div> 1081</div> 1082</div> 1083<div class="section"> 1084<div class="titlepage"><div><div><h6 class="title"> 1085<a name="thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue" title="Basic Concurrent Queue Operations">Basic 1086 Concurrent Queue Operations</a> 1087</h6></div></div></div> 1088<p> 1089 The essential solution to the problem of concurrent queuing is to shift 1090 to value-based operations, rather than reference-based operations. 1091 </p> 1092<p> 1093 The BasicConcurrentQueue concept models the basic operations of a concurrent 1094 queue. 1095 </p> 1096<p> 1097 A type <code class="computeroutput"><span class="identifier">Q</span></code> meets the 1098 BasicConcurrentQueue requirements if the following expressions are 1099 well-formed and have the specified semantics 1100 </p> 1101<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1102<li class="listitem"> 1103 Q::value_type 1104 </li> 1105<li class="listitem"> 1106 Q::size_type 1107 </li> 1108<li class="listitem"> 1109 <code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code> 1110 </li> 1111<li class="listitem"> 1112 <code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code> 1113 </li> 1114<li class="listitem"> 1115 <code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">lre</span><span class="special">);</span></code> 1116 </li> 1117<li class="listitem"> 1118 <code class="computeroutput"><span class="identifier">lre</span> <span class="special">=</span> 1119 <span class="identifier">q</span><span class="special">.</span><span class="identifier">pull_front</span><span class="special">();</span></code> 1120 </li> 1121<li class="listitem"> 1122 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> 1123 <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span></code> 1124 </li> 1125<li class="listitem"> 1126 <code class="computeroutput"><span class="identifier">u</span> <span class="special">=</span> 1127 <span class="identifier">q</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span></code> 1128 </li> 1129</ul></div> 1130<p> 1131 where 1132 </p> 1133<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1134<li class="listitem"> 1135 <code class="computeroutput"><span class="identifier">q</span></code> denotes a value 1136 of type <code class="computeroutput"><span class="identifier">Q</span></code>, 1137 </li> 1138<li class="listitem"> 1139 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value 1140 of type Q::value_type, 1141 </li> 1142<li class="listitem"> 1143 <code class="computeroutput"><span class="identifier">u</span></code> denotes a value 1144 of type Q::size_type, 1145 </li> 1146<li class="listitem"> 1147 <code class="computeroutput"><span class="identifier">lve</span></code> denotes an 1148 lvalue reference of type Q::value_type, 1149 </li> 1150<li class="listitem"> 1151 <code class="computeroutput"><span class="identifier">rve</span></code> denotes an 1152 rvalue reference of type Q::value_type: 1153 </li> 1154<li class="listitem"> 1155 <code class="computeroutput"><span class="identifier">qs</span></code> denotes a variable 1156 of of type <code class="computeroutput"><span class="identifier">queue_op_status</span></code>, 1157 </li> 1158</ul></div> 1159<div class="section"> 1160<div class="titlepage"><div><div><h6 class="title"> 1161<a name="thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.push_back"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.push_back" title="q.push_back(e);"><code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code></a> 1162</h6></div></div></div> 1163<div class="variablelist"> 1164<p class="title"><b></b></p> 1165<dl class="variablelist"> 1166<dt><span class="term">Effects:</span></dt> 1167<dd><p> 1168 Waits until the queue is not full (for bounded queues) and 1169 then push back <code class="computeroutput"><span class="identifier">e</span></code> 1170 to the queue copying it (this could need an allocation for 1171 unbounded queues). 1172 </p></dd> 1173<dt><span class="term">Synchronization:</span></dt> 1174<dd><p> 1175 Prior pull-like operations on the same object synchronizes 1176 with this operation. 1177 </p></dd> 1178<dt><span class="term">Postcondition:</span></dt> 1179<dd><p> 1180 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1181 </p></dd> 1182<dt><span class="term">Return type:</span></dt> 1183<dd><p> 1184 <code class="computeroutput"><span class="keyword">void</span></code>. 1185 </p></dd> 1186<dt><span class="term">Throws:</span></dt> 1187<dd><p> 1188 If the queue was closed, throws sync_queue_is_closed. Any exception 1189 thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1190 </p></dd> 1191<dt><span class="term">Exception safety:</span></dt> 1192<dd><p> 1193 If an exception is thrown then the queue state is unmodified. 1194 </p></dd> 1195</dl> 1196</div> 1197</div> 1198<div class="section"> 1199<div class="titlepage"><div><div><h6 class="title"> 1200<a name="thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.push_back_m"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.push_back_m" title="q.push_back(rve);"><code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code></a> 1201</h6></div></div></div> 1202<div class="variablelist"> 1203<p class="title"><b></b></p> 1204<dl class="variablelist"> 1205<dt><span class="term">Effects:</span></dt> 1206<dd><p> 1207 Waits until the queue is not full (for bounded queues) and 1208 then push <code class="computeroutput"><span class="identifier">e</span></code> 1209 to the queue moving it back in the queue (this could need an 1210 allocation for unbounded queues). 1211 </p></dd> 1212<dt><span class="term">Synchronization:</span></dt> 1213<dd><p> 1214 Prior pull-like operations on the same object synchronizes 1215 with this operation. 1216 </p></dd> 1217<dt><span class="term">Postcondition:</span></dt> 1218<dd><p> 1219 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1220 </p></dd> 1221<dt><span class="term">Return type:</span></dt> 1222<dd><p> 1223 <code class="computeroutput"><span class="keyword">void</span></code>. 1224 </p></dd> 1225<dt><span class="term">Throws:</span></dt> 1226<dd><p> 1227 If the queue is closed, throws sync_queue_is_closed. Any exception 1228 thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1229 </p></dd> 1230<dt><span class="term">Exception safety:</span></dt> 1231<dd><p> 1232 If an exception is thrown then the queue state is unmodified. 1233 </p></dd> 1234</dl> 1235</div> 1236</div> 1237<div class="section"> 1238<div class="titlepage"><div><div><h6 class="title"> 1239<a name="thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.pull_front_lv"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.pull_front_lv" title="q.pull_front(lve)"><code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">lve</span><span class="special">)</span></code></a> 1240</h6></div></div></div> 1241<div class="variablelist"> 1242<p class="title"><b></b></p> 1243<dl class="variablelist"> 1244<dt><span class="term">Effects:</span></dt> 1245<dd><p> 1246 Waits until the queue is not empty and then pull_front the 1247 element from the queue <code class="computeroutput"><span class="identifier">q</span></code> 1248 and moves the pulled element into <code class="computeroutput"><span class="identifier">lve</span></code> 1249 (this could need an allocation for unbounded queues). 1250 </p></dd> 1251<dt><span class="term">Synchronization:</span></dt> 1252<dd><p> 1253 Prior pull-like operations on the same object synchronizes 1254 with this operation. 1255 </p></dd> 1256<dt><span class="term">Postcondition:</span></dt> 1257<dd><p> 1258 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">()</span></code>. 1259 </p></dd> 1260<dt><span class="term">Return type:</span></dt> 1261<dd><p> 1262 <code class="computeroutput"><span class="keyword">void</span></code>. 1263 </p></dd> 1264<dt><span class="term">Throws:</span></dt> 1265<dd><p> 1266 Any exception thrown by the move of <code class="computeroutput"><span class="identifier">e</span></code>. 1267 </p></dd> 1268<dt><span class="term">Exception safety:</span></dt> 1269<dd><p> 1270 If an exception is thrown then the queue state is unmodified. 1271 </p></dd> 1272</dl> 1273</div> 1274</div> 1275<div class="section"> 1276<div class="titlepage"><div><div><h6 class="title"> 1277<a name="thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.pull_front"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.BasicConcurrentQueue.pull_front" title="e = q.pull_front()"><code class="computeroutput"><span class="identifier">e</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">pull_front</span><span class="special">()</span></code></a> 1278</h6></div></div></div> 1279<div class="variablelist"> 1280<p class="title"><b></b></p> 1281<dl class="variablelist"> 1282<dt><span class="term">Requires:</span></dt> 1283<dd><p> 1284 Q::value_type is no throw move constructible. This is needed 1285 to ensure the exception safety. 1286 </p></dd> 1287<dt><span class="term">Effects:</span></dt> 1288<dd><p> 1289 Waits until the queue is not empty and not closed. If the queue 1290 is empty and closed throws sync_queue_is_closed. Otherwise 1291 pull the element from the queue <code class="computeroutput"><span class="identifier">q</span></code> 1292 and moves the pulled element. 1293 </p></dd> 1294<dt><span class="term">Synchronization:</span></dt> 1295<dd><p> 1296 Prior pull-like operations on the same object synchronizes 1297 with this operation. 1298 </p></dd> 1299<dt><span class="term">Postcondition:</span></dt> 1300<dd><p> 1301 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">()</span></code>. 1302 </p></dd> 1303<dt><span class="term">Return type:</span></dt> 1304<dd><p> 1305 <code class="computeroutput"><span class="identifier">Q</span><span class="special">::</span><span class="identifier">value_type</span></code>. 1306 </p></dd> 1307<dt><span class="term">Return:</span></dt> 1308<dd><p> 1309 The pulled element. 1310 </p></dd> 1311<dt><span class="term">Throws:</span></dt> 1312<dd><p> 1313 Any exception thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1314 </p></dd> 1315<dt><span class="term">Exception safety:</span></dt> 1316<dd><p> 1317 If an exception is thrown then the queue state is unmodified. 1318 </p></dd> 1319</dl> 1320</div> 1321</div> 1322</div> 1323<div class="section"> 1324<div class="titlepage"><div><div><h6 class="title"> 1325<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting" title="Non-waiting Concurrent Queue Operations">Non-waiting 1326 Concurrent Queue Operations</a> 1327</h6></div></div></div> 1328<p> 1329 The ConcurrentQueue concept models a queue with Non-waiting operations. 1330 </p> 1331<p> 1332 A type <code class="computeroutput"><span class="identifier">Q</span></code> meets the 1333 ConcurrentQueue requirements if is a model of a BasicConcurrentQueue 1334 and the following expressions are well-formed and have the specified 1335 semantics 1336 </p> 1337<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1338<li class="listitem"> 1339 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1340 <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code> 1341 </li> 1342<li class="listitem"> 1343 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1344 <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code> 1345 </li> 1346<li class="listitem"> 1347 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1348 <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">lre</span><span class="special">);</span></code> 1349 </li> 1350</ul></div> 1351<p> 1352 where 1353 </p> 1354<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1355<li class="listitem"> 1356 <code class="computeroutput"><span class="identifier">q</span></code> denotes a value 1357 of type <code class="computeroutput"><span class="identifier">Q</span></code>, 1358 </li> 1359<li class="listitem"> 1360 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value 1361 of type <code class="computeroutput"><span class="identifier">Q</span><span class="special">::</span><span class="identifier">value_type</span></code>, 1362 </li> 1363<li class="listitem"> 1364 <code class="computeroutput"><span class="identifier">s</span></code> denotes a value 1365 of type <code class="computeroutput"><span class="identifier">queue_status</span></code>, 1366 </li> 1367<li class="listitem"> 1368 <code class="computeroutput"><span class="identifier">u</span></code> denotes a value 1369 of type <code class="computeroutput"><span class="identifier">Q</span><span class="special">::</span><span class="identifier">size_type</span></code>, 1370 </li> 1371<li class="listitem"> 1372 <code class="computeroutput"><span class="identifier">lve</span></code> denotes an 1373 lvalue reference of type Q::value_type, 1374 </li> 1375<li class="listitem"> 1376 <code class="computeroutput"><span class="identifier">rve</span></code> denotes an 1377 rvalue reference of type Q::value_type: 1378 </li> 1379</ul></div> 1380<div class="section"> 1381<div class="titlepage"><div><div><h6 class="title"> 1382<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_push_back"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_push_back" title="s = q.try_push_back(e);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code></a> 1383</h6></div></div></div> 1384<div class="variablelist"> 1385<p class="title"><b></b></p> 1386<dl class="variablelist"> 1387<dt><span class="term">Effects:</span></dt> 1388<dd><p> 1389 If the queue <code class="computeroutput"><span class="identifier">q</span></code> 1390 is not full and not closed, push back the <code class="computeroutput"><span class="identifier">e</span></code> 1391 to the queue copying it. 1392 </p></dd> 1393<dt><span class="term">Synchronization:</span></dt> 1394<dd><p> 1395 Prior pull-like operations on the same object synchronizes 1396 with this operation when the operation succeeds. 1397 </p></dd> 1398<dt><span class="term">Return type:</span></dt> 1399<dd><p> 1400 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1401 </p></dd> 1402<dt><span class="term">Return:</span></dt> 1403<dd> 1404<p> 1405 - If the queue is closed, returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1406 </p> 1407<p> 1408 - otherwise if the queue <code class="computeroutput"><span class="identifier">q</span></code> 1409 is full return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">full</span></code>, 1410 </p> 1411<p> 1412 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1413 </p> 1414</dd> 1415<dt><span class="term">Postcondition:</span></dt> 1416<dd><p> 1417 If the call returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>, 1418 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1419 </p></dd> 1420<dt><span class="term">Throws:</span></dt> 1421<dd><p> 1422 If the queue is closed, throws sync_queue_is_closed. Any exception 1423 thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1424 </p></dd> 1425<dt><span class="term">Exception safety:</span></dt> 1426<dd><p> 1427 If an exception is thrown then the queue state is unmodified. 1428 </p></dd> 1429</dl> 1430</div> 1431</div> 1432<div class="section"> 1433<div class="titlepage"><div><div><h6 class="title"> 1434<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_push_back_m"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_push_back_m" title="s = q.try_push_back(rve);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code></a> 1435</h6></div></div></div> 1436<div class="variablelist"> 1437<p class="title"><b></b></p> 1438<dl class="variablelist"> 1439<dt><span class="term">Effects:</span></dt> 1440<dd><p> 1441 If the queue <code class="computeroutput"><span class="identifier">q</span></code> 1442 is not full and not closed, push back the <code class="computeroutput"><span class="identifier">e</span></code> 1443 onto the queue moving it. 1444 </p></dd> 1445<dt><span class="term">Synchronization:</span></dt> 1446<dd><p> 1447 Prior pull-like operations on the same object synchronizes 1448 with this operation. 1449 </p></dd> 1450<dt><span class="term">Return type:</span></dt> 1451<dd><p> 1452 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1453 </p></dd> 1454<dt><span class="term">Return:</span></dt> 1455<dd> 1456<p> 1457 - If the queue is closed, returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1458 </p> 1459<p> 1460 - otherwise if the queue <code class="computeroutput"><span class="identifier">q</span></code> 1461 is full return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">full</span></code>, 1462 </p> 1463<p> 1464 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1465 </p> 1466</dd> 1467<dt><span class="term">Postcondition:</span></dt> 1468<dd><p> 1469 If the call returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>, 1470 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1471 </p></dd> 1472<dt><span class="term">Throws:</span></dt> 1473<dd><p> 1474 Any exception thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1475 </p></dd> 1476<dt><span class="term">Exception safety:</span></dt> 1477<dd><p> 1478 If an exception is thrown then the queue state is unmodified. 1479 </p></dd> 1480</dl> 1481</div> 1482</div> 1483<div class="section"> 1484<div class="titlepage"><div><div><h6 class="title"> 1485<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_pull_front_lv"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_waiting.try_pull_front_lv" title="s = q.try_pull_front(lve)"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">lve</span><span class="special">)</span></code></a> 1486</h6></div></div></div> 1487<div class="variablelist"> 1488<p class="title"><b></b></p> 1489<dl class="variablelist"> 1490<dt><span class="term">Effects:</span></dt> 1491<dd><p> 1492 If the queue is not empty pulls the element from the queue 1493 <code class="computeroutput"><span class="identifier">q</span></code> and moves 1494 the pulled element into <code class="computeroutput"><span class="identifier">lve</span></code> 1495 (this could need an allocation for unbounded queues). 1496 </p></dd> 1497<dt><span class="term">Synchronization:</span></dt> 1498<dd><p> 1499 Prior pull-like operations on the same object synchronizes 1500 with this operation. 1501 </p></dd> 1502<dt><span class="term">Postcondition:</span></dt> 1503<dd><p> 1504 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">()</span></code>. 1505 </p></dd> 1506<dt><span class="term">Return type:</span></dt> 1507<dd><p> 1508 <code class="computeroutput"><span class="keyword">bool</span></code>. 1509 </p></dd> 1510<dt><span class="term">Return:</span></dt> 1511<dd> 1512<p> 1513 - If the queue <code class="computeroutput"><span class="identifier">q</span></code> 1514 is empty return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">empty</span></code>, 1515 </p> 1516<p> 1517 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1518 </p> 1519</dd> 1520<dt><span class="term">Throws:</span></dt> 1521<dd><p> 1522 Any exception thrown by the move of <code class="computeroutput"><span class="identifier">e</span></code>. 1523 </p></dd> 1524<dt><span class="term">Exception safety:</span></dt> 1525<dd><p> 1526 If an exception is thrown then the queue state is unmodified. 1527 </p></dd> 1528</dl> 1529</div> 1530</div> 1531</div> 1532<div class="section"> 1533<div class="titlepage"><div><div><h6 class="title"> 1534<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking" title="Non-blocking Concurrent Queue Operations">Non-blocking 1535 Concurrent Queue Operations</a> 1536</h6></div></div></div> 1537<p> 1538 For cases when blocking for mutual exclusion is undesirable, we have 1539 non-blocking operations. The interface is the same as the try operations 1540 but is allowed to also return queue_op_status::busy in case the operation 1541 is unable to complete without blocking. 1542 </p> 1543<p> 1544 Non-blocking operations are provided only for lock based queues 1545 </p> 1546<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1547<li class="listitem"> 1548 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1549 <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> 1550 <span class="identifier">e</span><span class="special">);</span></code> 1551 </li> 1552<li class="listitem"> 1553 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1554 <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> 1555 <span class="identifier">rve</span><span class="special">);</span></code> 1556 </li> 1557<li class="listitem"> 1558 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1559 <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> 1560 <span class="identifier">lre</span><span class="special">);</span></code> 1561 </li> 1562</ul></div> 1563<p> 1564 where 1565 </p> 1566<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1567<li class="listitem"> 1568 <code class="computeroutput"><span class="identifier">q</span></code> denotes a value 1569 of type <code class="computeroutput"><span class="identifier">Q</span></code>, 1570 </li> 1571<li class="listitem"> 1572 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value 1573 of type Q::value_type, 1574 </li> 1575<li class="listitem"> 1576 <code class="computeroutput"><span class="identifier">s</span></code> denotes a value 1577 of type <code class="computeroutput"><span class="identifier">queue_status</span></code>, 1578 </li> 1579<li class="listitem"> 1580 <code class="computeroutput"><span class="identifier">lve</span></code> denotes an 1581 lvalue reference of type Q::value_type, 1582 </li> 1583<li class="listitem"> 1584 <code class="computeroutput"><span class="identifier">rve</span></code> denotes an 1585 rvalue reference of type Q::value_type: 1586 </li> 1587</ul></div> 1588<div class="section"> 1589<div class="titlepage"><div><div><h6 class="title"> 1590<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_push_back"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_push_back" title="s = q.nonblocking_push_back(e);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code></a> 1591</h6></div></div></div> 1592<div class="variablelist"> 1593<p class="title"><b></b></p> 1594<dl class="variablelist"> 1595<dt><span class="term">Effects:</span></dt> 1596<dd><p> 1597 If the queue <code class="computeroutput"><span class="identifier">q</span></code> 1598 is not full and not closed, push back the <code class="computeroutput"><span class="identifier">e</span></code> 1599 to the queue copying it. 1600 </p></dd> 1601<dt><span class="term">Synchronization:</span></dt> 1602<dd><p> 1603 Prior pull-like operations on the same object synchronizes 1604 with this operation when the operation succeeds. 1605 </p></dd> 1606<dt><span class="term">Return type:</span></dt> 1607<dd><p> 1608 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1609 </p></dd> 1610<dt><span class="term">Return:</span></dt> 1611<dd> 1612<p> 1613 - If the operation would block, return queue_op_status::busy, 1614 </p> 1615<p> 1616 - otherwise, if the queue is closed, return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1617 </p> 1618<p> 1619 - otherwise, if the queue <code class="computeroutput"><span class="identifier">q</span></code> 1620 is full return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">full</span></code>, 1621 </p> 1622<p> 1623 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1624 </p> 1625</dd> 1626<dt><span class="term">Postcondition:</span></dt> 1627<dd><p> 1628 If the call returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>, 1629 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1630 </p></dd> 1631<dt><span class="term">Throws:</span></dt> 1632<dd><p> 1633 If the queue is closed, throws sync_queue_is_closed. Any exception 1634 thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1635 </p></dd> 1636<dt><span class="term">Exception safety:</span></dt> 1637<dd><p> 1638 If an exception is thrown then the queue state is unmodified. 1639 </p></dd> 1640</dl> 1641</div> 1642</div> 1643<div class="section"> 1644<div class="titlepage"><div><div><h6 class="title"> 1645<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_push_back_m"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_push_back_m" title="s = q.nonblocking_push_back(rve);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code></a> 1646</h6></div></div></div> 1647<div class="variablelist"> 1648<p class="title"><b></b></p> 1649<dl class="variablelist"> 1650<dt><span class="term">Effects:</span></dt> 1651<dd><p> 1652 If the queue <code class="computeroutput"><span class="identifier">q</span></code> 1653 is not full and not closed, push back the <code class="computeroutput"><span class="identifier">e</span></code> 1654 onto the queue moving it. 1655 </p></dd> 1656<dt><span class="term">Synchronization:</span></dt> 1657<dd><p> 1658 Prior pull-like operations on the same object synchronizes 1659 with this operation. 1660 </p></dd> 1661<dt><span class="term">Return type:</span></dt> 1662<dd><p> 1663 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1664 </p></dd> 1665<dt><span class="term">Return:</span></dt> 1666<dd> 1667<p> 1668 - If the operation would block, return queue_op_status::busy, 1669 </p> 1670<p> 1671 - otherwise if the queue is closed, returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1672 </p> 1673<p> 1674 - otherwise if the queue <code class="computeroutput"><span class="identifier">q</span></code> 1675 is full return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">full</span></code>, 1676 </p> 1677<p> 1678 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1679 </p> 1680</dd> 1681<dt><span class="term">Postcondition:</span></dt> 1682<dd><p> 1683 If the call returns <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>, 1684 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1685 </p></dd> 1686<dt><span class="term">Throws:</span></dt> 1687<dd><p> 1688 Any exception thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1689 </p></dd> 1690<dt><span class="term">Exception safety:</span></dt> 1691<dd><p> 1692 If an exception is thrown then the queue state is unmodified. 1693 </p></dd> 1694</dl> 1695</div> 1696</div> 1697<div class="section"> 1698<div class="titlepage"><div><div><h6 class="title"> 1699<a name="thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_pull_front_lv"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.non_blocking.nonblocking_pull_front_lv" title="s = q.nonblocking_pull_front(lve)"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">lve</span><span class="special">)</span></code></a> 1700</h6></div></div></div> 1701<div class="variablelist"> 1702<p class="title"><b></b></p> 1703<dl class="variablelist"> 1704<dt><span class="term">Effects:</span></dt> 1705<dd><p> 1706 If the queue is not empty pulls the element from the queue 1707 <code class="computeroutput"><span class="identifier">q</span></code> and moves 1708 the pulled element into <code class="computeroutput"><span class="identifier">lve</span></code> 1709 (this could need an allocation for unbounded queues). 1710 </p></dd> 1711<dt><span class="term">Synchronization:</span></dt> 1712<dd><p> 1713 Prior pull-like operations on the same object synchronizes 1714 with this operation. 1715 </p></dd> 1716<dt><span class="term">Postcondition:</span></dt> 1717<dd><p> 1718 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">()</span></code>. 1719 </p></dd> 1720<dt><span class="term">Return type:</span></dt> 1721<dd><p> 1722 <code class="computeroutput"><span class="keyword">bool</span></code>. 1723 </p></dd> 1724<dt><span class="term">Return:</span></dt> 1725<dd> 1726<p> 1727 - If the operation would block, return queue_op_status::busy, 1728 </p> 1729<p> 1730 - otherwise if the queue <code class="computeroutput"><span class="identifier">q</span></code> 1731 is empty return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">empty</span></code>, 1732 </p> 1733<p> 1734 - otherwise return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code>; 1735 </p> 1736</dd> 1737<dt><span class="term">Throws:</span></dt> 1738<dd><p> 1739 Any exception thrown by the move of <code class="computeroutput"><span class="identifier">e</span></code>. 1740 </p></dd> 1741<dt><span class="term">Exception safety:</span></dt> 1742<dd><p> 1743 If an exception is thrown then the queue state is unmodified. 1744 </p></dd> 1745</dl> 1746</div> 1747</div> 1748</div> 1749<div class="section"> 1750<div class="titlepage"><div><div><h6 class="title"> 1751<a name="thread.sds.synchronized_queues.ref.sync_queue_req.bounded"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.bounded" title="Bounded Concurrent Queue Operations">Bounded 1752 Concurrent Queue Operations</a> 1753</h6></div></div></div> 1754<p> 1755 Bounded queues add the following valid expressions 1756 </p> 1757<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1758<li class="listitem"> 1759 <code class="computeroutput"><span class="identifier">Q</span> <span class="identifier">q</span><span class="special">(</span><span class="identifier">u</span><span class="special">);</span></code> 1760 </li> 1761<li class="listitem"> 1762 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> 1763 <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">();</span></code> 1764 </li> 1765<li class="listitem"> 1766 <code class="computeroutput"><span class="identifier">u</span> <span class="special">=</span> 1767 <span class="identifier">q</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span></code> 1768 </li> 1769</ul></div> 1770<p> 1771 where 1772 </p> 1773<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1774<li class="listitem"> 1775 <code class="computeroutput"><span class="identifier">q</span></code> denotes a value 1776 of type <code class="computeroutput"><span class="identifier">Q</span></code>, 1777 </li> 1778<li class="listitem"> 1779 <code class="computeroutput"><span class="identifier">b</span></code> denotes a value 1780 of type <code class="computeroutput"><span class="keyword">bool</span></code>, 1781 </li> 1782<li class="listitem"> 1783 <code class="computeroutput"><span class="identifier">u</span></code> denotes a value 1784 of type <code class="computeroutput"><span class="identifier">Q</span><span class="special">::</span><span class="identifier">size_type</span></code>, 1785 </li> 1786</ul></div> 1787<div class="section"> 1788<div class="titlepage"><div><div><h6 class="title"> 1789<a name="thread.sds.synchronized_queues.ref.sync_queue_req.bounded.full"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.bounded.full" title="b = q.full();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">();</span></code></a> 1790</h6></div></div></div> 1791<div class="variablelist"> 1792<p class="title"><b></b></p> 1793<dl class="variablelist"> 1794<dt><span class="term">Return type:</span></dt> 1795<dd><p> 1796 <code class="computeroutput"><span class="keyword">bool</span></code>. 1797 </p></dd> 1798<dt><span class="term">Return:</span></dt> 1799<dd><p> 1800 Return <code class="computeroutput"><span class="keyword">true</span></code> iff 1801 the queue is full. 1802 </p></dd> 1803<dt><span class="term">Remark:</span></dt> 1804<dd><p> 1805 Not all queues will have a full state, and these would always 1806 return false if the function is provided. 1807 </p></dd> 1808</dl> 1809</div> 1810</div> 1811<div class="section"> 1812<div class="titlepage"><div><div><h6 class="title"> 1813<a name="thread.sds.synchronized_queues.ref.sync_queue_req.bounded.capacity"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.bounded.capacity" title="b = q.capacity();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span></code></a> 1814</h6></div></div></div> 1815<div class="variablelist"> 1816<p class="title"><b></b></p> 1817<dl class="variablelist"> 1818<dt><span class="term">Return type:</span></dt> 1819<dd><p> 1820 <code class="computeroutput"><span class="identifier">Q</span><span class="special">::</span><span class="identifier">size_type</span></code>. 1821 </p></dd> 1822<dt><span class="term">Return:</span></dt> 1823<dd><p> 1824 Return the capacity of queue. 1825 </p></dd> 1826</dl> 1827</div> 1828</div> 1829</div> 1830<div class="section"> 1831<div class="titlepage"><div><div><h6 class="title"> 1832<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op" title="Closed Concurrent Queue Operations">Closed 1833 Concurrent Queue Operations</a> 1834</h6></div></div></div> 1835<p> 1836 Closed queues add the following valid expressions 1837 </p> 1838<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1839<li class="listitem"> 1840 <code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code> 1841 </li> 1842<li class="listitem"> 1843 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> 1844 <span class="identifier">q</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code> 1845 </li> 1846<li class="listitem"> 1847 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1848 <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code> 1849 </li> 1850<li class="listitem"> 1851 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1852 <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code> 1853 </li> 1854<li class="listitem"> 1855 <code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> 1856 <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_pull_front</span><span class="special">(</span><span class="identifier">lre</span><span class="special">);</span></code> 1857 </li> 1858</ul></div> 1859<div class="section"> 1860<div class="titlepage"><div><div><h6 class="title"> 1861<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back" title="q.close();"><code class="computeroutput"><span class="identifier">q</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code></a> 1862</h6></div></div></div> 1863<div class="variablelist"> 1864<p class="title"><b></b></p> 1865<dl class="variablelist"> 1866<dt><span class="term">Effects:</span></dt> 1867<dd><p> 1868 Close the queue. 1869 </p></dd> 1870</dl> 1871</div> 1872</div> 1873<div class="section"> 1874<div class="titlepage"><div><div><h6 class="title"> 1875<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back0"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back0" title="b = q.closed();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code></a> 1876</h6></div></div></div> 1877<div class="variablelist"> 1878<p class="title"><b></b></p> 1879<dl class="variablelist"> 1880<dt><span class="term">Return type:</span></dt> 1881<dd><p> 1882 <code class="computeroutput"><span class="keyword">bool</span></code>. 1883 </p></dd> 1884<dt><span class="term">Return:</span></dt> 1885<dd><p> 1886 Return <code class="computeroutput"><span class="keyword">true</span></code> iff 1887 the queue is closed. 1888 </p></dd> 1889</dl> 1890</div> 1891</div> 1892<div class="section"> 1893<div class="titlepage"><div><div><h6 class="title"> 1894<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back1"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back1" title="s = q.wait_push_back(e);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">e</span><span class="special">);</span></code></a> 1895</h6></div></div></div> 1896<div class="variablelist"> 1897<p class="title"><b></b></p> 1898<dl class="variablelist"> 1899<dt><span class="term">Effects:</span></dt> 1900<dd><p> 1901 Waits until the queue is not full (for bounded queues) and 1902 then push back <code class="computeroutput"><span class="identifier">e</span></code> 1903 to the queue copying it (this could need an allocation for 1904 unbounded queues). 1905 </p></dd> 1906<dt><span class="term">Synchronization:</span></dt> 1907<dd><p> 1908 Prior pull-like operations on the same object synchronizes 1909 with this operation. 1910 </p></dd> 1911<dt><span class="term">Postcondition:</span></dt> 1912<dd><p> 1913 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1914 </p></dd> 1915<dt><span class="term">Return type:</span></dt> 1916<dd><p> 1917 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1918 </p></dd> 1919<dt><span class="term">Return:</span></dt> 1920<dd> 1921<p> 1922 - If the queue is closed return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1923 </p> 1924<p> 1925 - otherwise, return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code> 1926 if no exception is thrown. 1927 </p> 1928</dd> 1929<dt><span class="term">Throws:</span></dt> 1930<dd><p> 1931 Any exception thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1932 </p></dd> 1933<dt><span class="term">Exception safety:</span></dt> 1934<dd><p> 1935 If an exception is thrown then the queue state is unmodified. 1936 </p></dd> 1937</dl> 1938</div> 1939</div> 1940<div class="section"> 1941<div class="titlepage"><div><div><h6 class="title"> 1942<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back_m"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_push_back_m" title="s = q.wait_push_back(rve);"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">rve</span><span class="special">);</span></code></a> 1943</h6></div></div></div> 1944<div class="variablelist"> 1945<p class="title"><b></b></p> 1946<dl class="variablelist"> 1947<dt><span class="term">Effects:</span></dt> 1948<dd><p> 1949 Waits until the queue is not full (for bounded queues) and 1950 then push <code class="computeroutput"><span class="identifier">e</span></code> 1951 to the queue moving it back in the queue (this could need an 1952 allocation for unbounded queues). 1953 </p></dd> 1954<dt><span class="term">Synchronization:</span></dt> 1955<dd><p> 1956 Prior pull-like operations on the same object synchronizes 1957 with this operation. 1958 </p></dd> 1959<dt><span class="term">Postcondition:</span></dt> 1960<dd><p> 1961 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>. 1962 </p></dd> 1963<dt><span class="term">Return type:</span></dt> 1964<dd><p> 1965 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 1966 </p></dd> 1967<dt><span class="term">Return:</span></dt> 1968<dd> 1969<p> 1970 - If the queue is closed return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 1971 </p> 1972<p> 1973 - otherwise, return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code> 1974 if no exception is thrown. 1975 </p> 1976<p> 1977 . 1978 </p> 1979</dd> 1980<dt><span class="term">Throws:</span></dt> 1981<dd><p> 1982 Any exception thrown by the copy of <code class="computeroutput"><span class="identifier">e</span></code>. 1983 </p></dd> 1984<dt><span class="term">Exception safety:</span></dt> 1985<dd><p> 1986 If an exception is thrown then the queue state is unmodified. 1987 </p></dd> 1988</dl> 1989</div> 1990</div> 1991<div class="section"> 1992<div class="titlepage"><div><div><h6 class="title"> 1993<a name="thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_pull_front_lv"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_req.closed_op.wait_pull_front_lv" title="s = q.wait_pull_front(lve)"><code class="computeroutput"><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">wait_pull_front</span><span class="special">(</span><span class="identifier">lve</span><span class="special">)</span></code></a> 1994</h6></div></div></div> 1995<div class="variablelist"> 1996<p class="title"><b></b></p> 1997<dl class="variablelist"> 1998<dt><span class="term">Effects:</span></dt> 1999<dd><p> 2000 if the queue is not empty and not closed, waits until the queue 2001 is not empty and then pull_front the element from the queue 2002 <code class="computeroutput"><span class="identifier">q</span></code> and moves 2003 the pulled element into <code class="computeroutput"><span class="identifier">lve</span></code>. 2004 </p></dd> 2005<dt><span class="term">Synchronization:</span></dt> 2006<dd><p> 2007 Prior pull-like operations on the same object synchronizes 2008 with this operation. 2009 </p></dd> 2010<dt><span class="term">Postcondition:</span></dt> 2011<dd><p> 2012 <code class="computeroutput"><span class="special">!</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">full</span><span class="special">()</span></code>. 2013 </p></dd> 2014<dt><span class="term">Return type:</span></dt> 2015<dd><p> 2016 <code class="computeroutput"><span class="identifier">queue_op_status</span></code>. 2017 </p></dd> 2018<dt><span class="term">Return:</span></dt> 2019<dd> 2020<p> 2021 - If the queue is empty and closed, return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">closed</span></code>, 2022 </p> 2023<p> 2024 - otherwise, return <code class="computeroutput"><span class="identifier">queue_op_status</span><span class="special">::</span><span class="identifier">success</span></code> 2025 if no exception is thrown. 2026 </p> 2027</dd> 2028<dt><span class="term">Throws:</span></dt> 2029<dd><p> 2030 Any exception thrown by the move of <code class="computeroutput"><span class="identifier">e</span></code>. 2031 </p></dd> 2032<dt><span class="term">Exception safety:</span></dt> 2033<dd><p> 2034 If an exception is thrown then the queue state is unmodified. 2035 </p></dd> 2036</dl> 2037</div> 2038</div> 2039</div> 2040</div> 2041<div class="section"> 2042<div class="titlepage"><div><div><h5 class="title"> 2043<a name="thread.sds.synchronized_queues.ref.queue_op_status"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_op_status" title="Queue Operation Status">Queue 2044 Operation Status</a> 2045</h5></div></div></div> 2046<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">concurrent_queues</span><span class="special">/</span><span class="identifier">queue_op_status</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2047 2048<span class="keyword">namespace</span> <span class="identifier">boost</span> 2049<span class="special">{</span> 2050 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">queue_op_status</span> <span class="special">{</span> <span class="identifier">success</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">empty</span><span class="special">,</span> <span class="identifier">full</span><span class="special">,</span> <span class="identifier">closed</span><span class="special">,</span> <span class="identifier">busy</span> <span class="special">}</span> 2051<span class="special">}</span> 2052</pre> 2053</div> 2054<div class="section"> 2055<div class="titlepage"><div><div><h5 class="title"> 2056<a name="thread.sds.synchronized_queues.ref.queue_base"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_base" title="Queue Base">Queue 2057 Base</a> 2058</h5></div></div></div> 2059<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">concurrent_queues</span><span class="special">/</span><span class="identifier">queue_base</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2060 2061<span class="keyword">namespace</span> <span class="identifier">boost</span> 2062<span class="special">{</span> 2063 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">SizeType</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> 2064 <span class="keyword">class</span> <span class="identifier">queue_base</span> 2065 <span class="special">{</span> 2066 <span class="keyword">public</span><span class="special">:</span> 2067 <span class="keyword">typedef</span> <span class="identifier">ValueType</span> <span class="identifier">value_type</span><span class="special">;</span> 2068 <span class="keyword">typedef</span> <span class="identifier">SizeType</span> <span class="identifier">size_type</span><span class="special">;</span> 2069 2070 <span class="comment">// Constructors/Assignment/Destructors</span> 2071 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">queue_base</span><span class="special">()</span> <span class="special">{};</span> 2072 2073 <span class="comment">// Observers</span> 2074 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2075 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2076 <span class="keyword">virtual</span> <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2077 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2078 2079 <span class="comment">// Modifiers</span> 2080 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2081 2082 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2083 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2084 2085 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2086 <span class="keyword">virtual</span> <span class="identifier">value_type</span> <span class="identifier">pull_front</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2087 2088 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2089 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2090 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2091 2092 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2093 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2094 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2095 2096 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">wait_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2097 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2098 <span class="keyword">virtual</span> <span class="identifier">queue_op_status</span> <span class="identifier">wait_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">elem</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 2099 2100 <span class="special">};</span> 2101<span class="special">}</span> 2102</pre> 2103</div> 2104<div class="section"> 2105<div class="titlepage"><div><div><h5 class="title"> 2106<a name="thread.sds.synchronized_queues.ref.queue_adaptor"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_adaptor" title="Queue Adaptor">Queue 2107 Adaptor</a> 2108</h5></div></div></div> 2109<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">concurrent_queues</span><span class="special">/</span><span class="identifier">queue_adaptor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2110 2111<span class="keyword">namespace</span> <span class="identifier">boost</span> 2112<span class="special">{</span> 2113 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">></span> 2114 <span class="keyword">class</span> <span class="identifier">queue_adaptor</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">queue_base</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">size_type</span><span class="special">></span> 2115 <span class="special">{</span> 2116 <span class="keyword">public</span><span class="special">:</span> 2117 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span> 2118 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span> 2119 2120 <span class="comment">// Constructors/Assignment/Destructors</span> 2121 2122 <span class="identifier">queue_adaptor</span><span class="special">();</span> 2123 2124 <span class="comment">// Observers</span> 2125 <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2126 <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2127 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">queue</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span> 2128 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2129 2130 <span class="comment">// Modifiers</span> 2131 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 2132 2133 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2134 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2135 2136 <span class="keyword">void</span> <span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2137 <span class="identifier">value_type</span> <span class="identifier">pull_front</span><span class="special">();</span> 2138 2139 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2140 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2141 <span class="identifier">queue_op_status</span> <span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2142 2143 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2144 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2145 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2146 2147 <span class="identifier">queue_op_status</span> <span class="identifier">wait_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2148 <span class="identifier">queue_op_status</span> <span class="identifier">wait_push_back</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2149 <span class="identifier">queue_op_status</span> <span class="identifier">wait_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2150 2151 <span class="special">};</span> 2152<span class="special">}</span> 2153</pre> 2154</div> 2155<div class="section"> 2156<div class="titlepage"><div><div><h5 class="title"> 2157<a name="thread.sds.synchronized_queues.ref.queue_views"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_views" title="Queue Views">Queue 2158 Views</a> 2159</h5></div></div></div> 2160<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">concurrent_queues</span><span class="special">/</span><span class="identifier">queue_views</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2161 2162<span class="keyword">namespace</span> <span class="identifier">boost</span> 2163<span class="special">{</span> 2164 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">></span> 2165 <span class="keyword">class</span> <span class="identifier">queue_back_view</span><span class="special">;</span> 2166 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">></span> 2167 <span class="keyword">class</span> <span class="identifier">queue_front_view</span> 2168 2169 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 2170 <span class="keyword">using</span> <span class="identifier">queue_back</span> <span class="special">=</span> <span class="identifier">queue_back_view</span><span class="special"><</span><span class="identifier">queue_base</span><span class="special"><</span><span class="identifier">T</span><span class="special">>>;</span> 2171 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 2172 <span class="keyword">using</span> <span class="identifier">queue_front</span> <span class="special">=</span> <span class="identifier">queue_front_view</span><span class="special"><</span><span class="identifier">queue_base</span><span class="special"><</span><span class="identifier">T</span><span class="special">>>;</span> 2173<span class="special">}</span> 2174</pre> 2175<div class="section"> 2176<div class="titlepage"><div><div><h6 class="title"> 2177<a name="thread.sds.synchronized_queues.ref.queue_views.queue_back_view"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_views.queue_back_view" title="Class template queue_back_view<>">Class 2178 template <code class="computeroutput"><span class="identifier">queue_back_view</span><span class="special"><></span></code></a> 2179</h6></div></div></div> 2180<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">></span> 2181<span class="keyword">class</span> <span class="identifier">queue_back_view</span> 2182<span class="special">{</span> 2183<span class="keyword">public</span><span class="special">:</span> 2184 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span> 2185 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span> 2186 2187 <span class="comment">// Constructors/Assignment/Destructors</span> 2188 <span class="identifier">queue_back_view</span><span class="special">(</span><span class="identifier">Queue</span><span class="special">&</span> <span class="identifier">q</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 2189 2190 <span class="comment">// Observers</span> 2191 <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2192 <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2193 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2194 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2195 2196 <span class="comment">// Modifiers</span> 2197 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 2198 2199 <span class="keyword">void</span> <span class="identifier">push</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2200 <span class="keyword">void</span> <span class="identifier">push</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2201 2202 <span class="identifier">queue_op_status</span> <span class="identifier">try_push</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2203 <span class="identifier">queue_op_status</span> <span class="identifier">try_push</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2204 2205 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2206 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2207 2208 <span class="identifier">queue_op_status</span> <span class="identifier">wait_push</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2209 <span class="identifier">queue_op_status</span> <span class="identifier">wait_push</span><span class="special">(</span><span class="identifier">BOOST_THREAD_RV_REF</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="identifier">x</span><span class="special">);</span> 2210 2211<span class="special">};</span> 2212</pre> 2213</div> 2214<div class="section"> 2215<div class="titlepage"><div><div><h6 class="title"> 2216<a name="thread.sds.synchronized_queues.ref.queue_views.queue_front_view"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.queue_views.queue_front_view" title="Class template queue_front_view<>">Class 2217 template <code class="computeroutput"><span class="identifier">queue_front_view</span><span class="special"><></span></code></a> 2218</h6></div></div></div> 2219<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">></span> 2220<span class="keyword">class</span> <span class="identifier">queue_front_view</span> 2221<span class="special">{</span> 2222<span class="keyword">public</span><span class="special">:</span> 2223 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span> 2224 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span> 2225 2226 <span class="comment">// Constructors/Assignment/Destructors</span> 2227 <span class="identifier">queue_front_view</span><span class="special">(</span><span class="identifier">Queue</span><span class="special">&</span> <span class="identifier">q</span><span class="special">)</span> <span class="identifier">BOOST_NOEXCEPT</span><span class="special">;</span> 2228 2229 <span class="comment">// Observers</span> 2230 <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2231 <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2232 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2233 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2234 2235 <span class="comment">// Modifiers</span> 2236 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 2237 2238 <span class="keyword">void</span> <span class="identifier">pull</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2239 <span class="identifier">value_type</span> <span class="identifier">pull</span><span class="special">();</span> 2240 2241 <span class="identifier">queue_op_status</span> <span class="identifier">try_pull</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2242 2243 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_pull</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2244 2245 <span class="identifier">queue_op_status</span> <span class="identifier">wait_pull</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2246 2247<span class="special">};</span> 2248</pre> 2249</div> 2250</div> 2251<div class="section"> 2252<div class="titlepage"><div><div><h5 class="title"> 2253<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref" title="Synchronized Bounded Queue">Synchronized 2254 Bounded Queue</a> 2255</h5></div></div></div> 2256<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_bounded_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2257 2258<span class="keyword">namespace</span> <span class="identifier">boost</span> 2259<span class="special">{</span> 2260 <span class="keyword">struct</span> <span class="identifier">sync_queue_is_closed</span> <span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span> <span class="special">{};</span> 2261 2262 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2263 <span class="keyword">class</span> <span class="identifier">sync_bounded_queue</span><span class="special">;</span> 2264 2265 <span class="comment">// Stream-like operators</span> 2266 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2267 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&&</span> <span class="identifier">elem</span><span class="special">);</span> 2268 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2269 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2270 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2271 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special">>>(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2272<span class="special">}</span> 2273</pre> 2274<div class="section"> 2275<div class="titlepage"><div><div><h6 class="title"> 2276<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_queue_is_closed"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_queue_is_closed" title="Class sync_queue_is_closed">Class 2277 <code class="computeroutput"><span class="identifier">sync_queue_is_closed</span></code></a> 2278</h6></div></div></div> 2279<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_bounded_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2280 2281<span class="keyword">namespace</span> <span class="identifier">boost</span> 2282<span class="special">{</span> 2283 <span class="keyword">struct</span> <span class="identifier">sync_queue_is_closed</span> <span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span> <span class="special">{};</span> 2284<span class="special">}</span> 2285</pre> 2286</div> 2287<div class="section"> 2288<div class="titlepage"><div><div><h6 class="title"> 2289<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue" title="Class template sync_bounded_queue<>">Class 2290 template <code class="computeroutput"><span class="identifier">sync_bounded_queue</span><span class="special"><></span></code></a> 2291</h6></div></div></div> 2292<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_bounded_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2293<span class="keyword">namespace</span> <span class="identifier">boost</span> 2294<span class="special">{</span> 2295 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2296 <span class="keyword">class</span> <span class="identifier">sync_bounded_queue</span> 2297 <span class="special">{</span> 2298 <span class="keyword">public</span><span class="special">:</span> 2299 <span class="keyword">typedef</span> <span class="identifier">ValueType</span> <span class="identifier">value_type</span><span class="special">;</span> 2300 <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size_type</span><span class="special">;</span> 2301 2302 <span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">sync_bounded_queue</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 2303 <span class="identifier">sync_bounded_queue</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">sync_bounded_queue</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 2304 <span class="keyword">explicit</span> <span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">max_elems</span><span class="special">);</span> 2305 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">></span> 2306 <span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">max_elems</span><span class="special">,</span> <span class="identifier">Range</span> <span class="identifier">range</span><span class="special">);</span> 2307 <span class="special">~</span><span class="identifier">sync_bounded_queue</span><span class="special">();</span> 2308 2309 <span class="comment">// Observers</span> 2310 <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2311 <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2312 <span class="identifier">size_type</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2313 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2314 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2315 2316 <span class="comment">// Modifiers</span> 2317 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2318 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&</span> <span class="identifier">x</span><span class="special">);</span> 2319 2320 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2321 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&)</span> <span class="identifier">x</span><span class="special">);</span> 2322 2323 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2324 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&</span> <span class="identifier">x</span><span class="special">);</span> 2325 2326 <span class="keyword">void</span> <span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2327 <span class="identifier">value_type</span> <span class="identifier">pull_front</span><span class="special">();</span> 2328 2329 <span class="identifier">queue_op_status</span> <span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2330 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2331 2332 2333 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 2334 <span class="special">};</span> 2335<span class="special">}</span> 2336</pre> 2337<div class="section"> 2338<div class="titlepage"><div><div><h6 class="title"> 2339<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue.constructor"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue.constructor" title="Constructor sync_bounded_queue(size_type)">Constructor 2340 <code class="computeroutput"><span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span></code></a> 2341</h6></div></div></div> 2342<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">max_elems</span><span class="special">);</span> 2343</pre> 2344<div class="variablelist"> 2345<p class="title"><b></b></p> 2346<dl class="variablelist"> 2347<dt><span class="term">Effects:</span></dt> 2348<dd><p> 2349 Constructs a sync_bounded_queue with a maximum number of elements 2350 given by <code class="computeroutput"><span class="identifier">max_elems</span></code>. 2351 </p></dd> 2352<dt><span class="term">Throws:</span></dt> 2353<dd><p> 2354 any exception that can be throw because of resources unavailable. 2355 </p></dd> 2356</dl> 2357</div> 2358</div> 2359<div class="section"> 2360<div class="titlepage"><div><div><h6 class="title"> 2361<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue.constructort"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.sync_bounded_queue.constructort" title="Template Constructor sync_bounded_queue(size_type, Range)">Template 2362 Constructor <code class="computeroutput"><span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span><span class="special">,</span> <span class="identifier">Range</span><span class="special">)</span></code></a> 2363</h6></div></div></div> 2364<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">></span> 2365<span class="identifier">sync_bounded_queue</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">max_elems</span><span class="special">,</span> <span class="identifier">Range</span> <span class="identifier">range</span><span class="special">);</span> 2366</pre> 2367<div class="variablelist"> 2368<p class="title"><b></b></p> 2369<dl class="variablelist"> 2370<dt><span class="term">Effects:</span></dt> 2371<dd><p> 2372 Constructs a sync_bounded_queue with a maximum number of elements 2373 given by <code class="computeroutput"><span class="identifier">max_elems</span></code> 2374 and push back the elements of the range. 2375 </p></dd> 2376<dt><span class="term">Throws:</span></dt> 2377<dd><p> 2378 any exception that can be throw because of resources unavailable. 2379 </p></dd> 2380</dl> 2381</div> 2382</div> 2383</div> 2384<div class="section"> 2385<div class="titlepage"><div><div><h6 class="title"> 2386<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.stream_out_operators"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.stream_out_operators" title="Non-Member Function operator<<()">Non-Member 2387 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special"><<()</span></code></a> 2388</h6></div></div></div> 2389<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_bounded_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2390<span class="keyword">namespace</span> <span class="identifier">boost</span> 2391<span class="special">{</span> 2392 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2393 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&&</span> <span class="identifier">elem</span><span class="special">);</span> 2394 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2395 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2396<span class="special">}</span> 2397</pre> 2398</div> 2399<div class="section"> 2400<div class="titlepage"><div><div><h6 class="title"> 2401<a name="thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.stream_in_operators"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_bounded_queue_ref.stream_in_operators" title="Non-Member Function operator>>()">Non-Member 2402 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">>>()</span></code></a> 2403</h6></div></div></div> 2404<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_bounded_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2405<span class="keyword">namespace</span> <span class="identifier">boost</span> 2406<span class="special">{</span> 2407 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2408 <span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special">>>(</span><span class="identifier">sync_bounded_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2409<span class="special">}</span> 2410</pre> 2411</div> 2412</div> 2413<div class="section"> 2414<div class="titlepage"><div><div><h5 class="title"> 2415<a name="thread.sds.synchronized_queues.ref.sync_queue_ref"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref" title="Synchronized Unbounded Queue">Synchronized 2416 Unbounded Queue</a> 2417</h5></div></div></div> 2418<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2419<span class="keyword">namespace</span> <span class="identifier">boost</span> 2420<span class="special">{</span> 2421 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2422 <span class="keyword">class</span> <span class="identifier">sync_queue</span><span class="special">;</span> 2423 2424 <span class="comment">// Stream-like operators</span> 2425 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2426 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&&</span> <span class="identifier">elem</span><span class="special">);</span> 2427 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2428 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2429 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2430 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special">>>(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2431<span class="special">}</span> 2432</pre> 2433<div class="section"> 2434<div class="titlepage"><div><div><h6 class="title"> 2435<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue" title="Class template sync_queue<>">Class 2436 template <code class="computeroutput"><span class="identifier">sync_queue</span><span class="special"><></span></code></a> 2437</h6></div></div></div> 2438<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2439 2440<span class="keyword">namespace</span> <span class="identifier">boost</span> 2441<span class="special">{</span> 2442 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Container</span> <span class="special">=</span> <span class="identifier">csbl</span><span class="special">::</span><span class="identifier">devector</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>></span> 2443 <span class="keyword">class</span> <span class="identifier">sync_queue</span> 2444 <span class="special">{</span> 2445 <span class="keyword">public</span><span class="special">:</span> 2446 <span class="keyword">typedef</span> <span class="identifier">ValueType</span> <span class="identifier">value_type</span><span class="special">;</span> 2447 <span class="keyword">typedef</span> <span class="identifier">Container</span> <span class="identifier">underlying_queue_type</span><span class="special">;</span> 2448 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span> 2449 2450 <span class="identifier">sync_queue</span><span class="special">(</span><span class="identifier">sync_queue</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 2451 <span class="identifier">sync_queue</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">sync_queue</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 2452 <span class="identifier">sync_queue</span><span class="special">();</span> 2453 <span class="keyword">explicit</span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">></span> 2454 <span class="identifier">sync_queue</span><span class="special">(</span><span class="identifier">Range</span> <span class="identifier">range</span><span class="special">);</span> <span class="comment">// Not yet implemented</span> 2455 <span class="special">~</span><span class="identifier">sync_queue</span><span class="special">();</span> 2456 2457 <span class="comment">// Observers</span> 2458 <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2459 <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2460 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2461 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2462 2463 <span class="comment">// Modifiers</span> 2464 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2465 <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&</span> <span class="identifier">x</span><span class="special">);</span> 2466 2467 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2468 <span class="identifier">queue_op_status</span> <span class="identifier">try_push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&)</span> <span class="identifier">x</span><span class="special">);</span> 2469 2470 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 2471 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_push_back</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&&</span> <span class="identifier">x</span><span class="special">);</span> 2472 2473 <span class="keyword">void</span> <span class="identifier">pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2474 <span class="identifier">value_type</span> <span class="identifier">pull_front</span><span class="special">();</span> 2475 2476 <span class="identifier">queue_op_status</span> <span class="identifier">try_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2477 <span class="identifier">queue_op_status</span> <span class="identifier">nonblocking_pull_front</span><span class="special">(</span><span class="identifier">value_type</span><span class="special">&);</span> 2478 2479 <span class="identifier">underlying_queue_type</span> <span class="identifier">underlying_queue</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 2480 2481 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 2482 <span class="special">};</span> 2483<span class="special">}</span> 2484</pre> 2485<div class="section"> 2486<div class="titlepage"><div><div><h6 class="title"> 2487<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.constructor"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.constructor" title="Constructor sync_queue(size_type)">Constructor 2488 <code class="computeroutput"><span class="identifier">sync_queue</span><span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span></code></a> 2489</h6></div></div></div> 2490<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">sync_queue</span><span class="special">();</span> 2491</pre> 2492<div class="variablelist"> 2493<p class="title"><b></b></p> 2494<dl class="variablelist"> 2495<dt><span class="term">Effects:</span></dt> 2496<dd><p> 2497 Constructs an empty sync_queue. 2498 </p></dd> 2499<dt><span class="term">Throws:</span></dt> 2500<dd><p> 2501 any exception that can be throw because of resources unavailable. 2502 </p></dd> 2503</dl> 2504</div> 2505</div> 2506<div class="section"> 2507<div class="titlepage"><div><div><h6 class="title"> 2508<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.full"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.full" title="Member Function full()">Member 2509 Function <code class="computeroutput"><span class="identifier">full</span><span class="special">()</span></code></a> 2510</h6></div></div></div> 2511<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 2512</pre> 2513<div class="variablelist"> 2514<p class="title"><b></b></p> 2515<dl class="variablelist"> 2516<dt><span class="term">Returns:</span></dt> 2517<dd><p> 2518 false. 2519 </p></dd> 2520</dl> 2521</div> 2522</div> 2523<div class="section"> 2524<div class="titlepage"><div><div><h6 class="title"> 2525<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.constructor0"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.sync_queue.constructor0" title="Member Function underlying_queue()">Member 2526 Function <code class="computeroutput"><span class="identifier">underlying_queue</span><span class="special">()</span></code></a> 2527</h6></div></div></div> 2528<pre class="programlisting"><span class="identifier">underlying_queue_type</span> <span class="identifier">underlying_queue</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 2529</pre> 2530<div class="variablelist"> 2531<p class="title"><b></b></p> 2532<dl class="variablelist"> 2533<dt><span class="term">Returns:</span></dt> 2534<dd><p> 2535 Moves internal queue. 2536 </p></dd> 2537</dl> 2538</div> 2539</div> 2540</div> 2541<div class="section"> 2542<div class="titlepage"><div><div><h6 class="title"> 2543<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.stream_out_operators"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.stream_out_operators" title="Non-Member Function operator<<()">Non-Member 2544 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special"><<()</span></code></a> 2545</h6></div></div></div> 2546<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2547<span class="keyword">namespace</span> <span class="identifier">boost</span> 2548<span class="special">{</span> 2549 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2550 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&&</span> <span class="identifier">elem</span><span class="special">);</span> 2551 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2552 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2553<span class="special">}</span> 2554</pre> 2555</div> 2556<div class="section"> 2557<div class="titlepage"><div><div><h6 class="title"> 2558<a name="thread.sds.synchronized_queues.ref.sync_queue_ref.stream_in_operators"></a><a class="link" href="sds.html#thread.sds.synchronized_queues.ref.sync_queue_ref.stream_in_operators" title="Non-Member Function operator>>()">Non-Member 2559 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">>>()</span></code></a> 2560</h6></div></div></div> 2561<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2562<span class="keyword">namespace</span> <span class="identifier">boost</span> 2563<span class="special">{</span> 2564 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 2565 <span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special">>>(</span><span class="identifier">sync_queue</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>&</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&</span><span class="identifier">elem</span><span class="special">);</span> 2566<span class="special">}</span> 2567</pre> 2568</div> 2569</div> 2570</div> 2571</div> 2572</div> 2573<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 2574<td align="left"></td> 2575<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -17 Vicente J. Botet Escriba<p> 2576 Distributed under the Boost Software License, Version 1.0. (See accompanying 2577 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>) 2578 </p> 2579</div></td> 2580</tr></table> 2581<hr> 2582<div class="spirit-nav"> 2583<a accesskey="p" href="thread_local_storage.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="parallel.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 2584</div> 2585</body> 2586</html> 2587