• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</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">&amp;</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">&amp;</span> <span class="identifier">extra</span><span class="special">)</span>
128<span class="special">{</span>
129  <span class="identifier">value3</span><span class="special">-&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="special">&amp;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</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">-&gt;</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">-&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">-&gt;</span><span class="identifier">empty</span><span class="special">())</span>
194  <span class="special">{</span>
195    <span class="identifier">u2</span><span class="special">-&gt;</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-&gt;</span><span class="identifier">front</span><span class="special">());</span>
196    <span class="identifier">u1</span><span class="special">-&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">-&gt;</span><span class="identifier">empty</span><span class="special">())</span>
219  <span class="special">{</span>
220    <span class="identifier">u2</span><span class="special">-&gt;</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-&gt;</span><span class="identifier">front</span><span class="special">());</span>
221    <span class="identifier">u1</span><span class="special">-&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">queue</span><span class="special">&lt;</span><span class="identifier">MessageType</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">lks</span><span class="special">)-&gt;</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">&lt;</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">lks</span><span class="special">)-&gt;</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">u1</span><span class="special">-&gt;</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">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">lks</span><span class="special">)-&gt;</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">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
278  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
280  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
281  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="special">&amp;</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">&lt;</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">&gt;</span>
285  <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
286
287  <span class="comment">// Comparison</span>
288  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
290  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
292  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
293  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
294  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
295  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
296  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
297  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
298  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
299  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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">&lt;</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">&gt;</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">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
304  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
306  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
307  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
308  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
309  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
310  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
311  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
312  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
313  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">);</span>
314
315  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
317  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
319  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
320  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
321  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
322  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
323  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
324  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
325  <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
326  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="identifier">synchronized_value</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">L</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</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">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">SV</span><span class="special">&gt;</span>
330  <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">synchronized_value_strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">SV</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">...&gt;</span> <span class="identifier">synchronize</span><span class="special">(</span><span class="identifier">SV</span><span class="special">&amp;</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">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;</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">&amp;&amp;</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">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
359    <span class="identifier">synchronized_value</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</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">&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
370    <span class="identifier">const_strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>
371    <span class="identifier">strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">synchronize</span><span class="special">();</span>
372    <span class="identifier">const_strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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&amp;)"><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">&amp;)</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">&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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&amp;)"><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">&amp;)</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">&amp;</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">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span><span class="special">&amp;)</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&amp;&amp;)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;)</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">&amp;&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;)</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&amp;&amp;)"><code class="computeroutput"><span class="identifier">synchronized_value</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&amp;&amp;)</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">&amp;&amp;</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">&amp;&amp;)</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&amp;)"><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">&amp;)</span></code></a>
516</h6></div></div></div>
517<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">synchronized_value</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</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">&amp;)</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&amp;)"><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">&amp;)</span></code></a>
551</h6></div></div></div>
552<pre class="programlisting"><span class="identifier">synchronized_value</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</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">&amp;)</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">&amp;)</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">&amp;)</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&amp;)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&amp;)</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">&amp;</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&amp;)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">synchronized_value</span><span class="special">&amp;)</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">&amp;</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-&gt;()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</span></code></a>
697</h6></div></div></div>
698<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
699</pre>
700<p>
701              Essentially calling a method <code class="computeroutput"><span class="identifier">obj</span><span class="special">-&gt;</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">&lt;&gt;.</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-&gt;() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">-&gt;()</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">-&gt;</span></code>. So, for example, <code class="computeroutput"><span class="identifier">vec</span><span class="special">-&gt;</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">&lt;&gt;.</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</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">-&gt;</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">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;&gt;</span> <span class="special">&amp;</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">&lt;&gt;.</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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</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">&lt;&gt;.</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">SV</span><span class="special">&gt;</span>
886  <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">synchronized_value_strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">SV</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">...&gt;</span> <span class="identifier">synchronize</span><span class="special">(</span><span class="identifier">SV</span><span class="special">&amp;</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">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&amp;</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">&amp;)</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">&amp;</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">&amp;)</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">&amp;</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">&amp;)</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">&amp;</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">&amp;</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">&gt;</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">&lt;</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">&gt;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">&gt;</span>
2167  <span class="keyword">class</span> <span class="identifier">queue_front_view</span>
2168
2169  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</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">&lt;</span><span class="identifier">queue_base</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;;</span>
2171  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</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">&lt;</span><span class="identifier">queue_base</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;;</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&lt;&gt;">Class
2178            template <code class="computeroutput"><span class="identifier">queue_back_view</span><span class="special">&lt;&gt;</span></code></a>
2179</h6></div></div></div>
2180<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">&gt;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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&lt;&gt;">Class
2217            template <code class="computeroutput"><span class="identifier">queue_front_view</span><span class="special">&lt;&gt;</span></code></a>
2218</h6></div></div></div>
2219<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Queue</span><span class="special">&gt;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2267  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&amp;&amp;</span> <span class="identifier">elem</span><span class="special">);</span>
2268  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2269  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">elem</span><span class="special">);</span>
2270  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2271  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&amp;</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">&lt;</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">&gt;</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&lt;&gt;">Class
2290            template <code class="computeroutput"><span class="identifier">sync_bounded_queue</span><span class="special">&lt;&gt;</span></code></a>
2291</h6></div></div></div>
2292<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</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">&amp;)</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">&amp;</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">&amp;)</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">&gt;</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">&amp;</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">&amp;&amp;</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">&amp;</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">&amp;&amp;)</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">&amp;</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">&amp;&amp;</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">&amp;);</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">&amp;);</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">&amp;);</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">&gt;</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&lt;&lt;()">Non-Member
2387            Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;()</span></code></a>
2388</h6></div></div></div>
2389<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2393  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&amp;&amp;</span> <span class="identifier">elem</span><span class="special">);</span>
2394  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2395  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&amp;</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&gt;&gt;()">Non-Member
2402            Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;()</span></code></a>
2403</h6></div></div></div>
2404<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2408  <span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">sync_bounded_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&amp;</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2426  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&amp;&amp;</span> <span class="identifier">elem</span><span class="special">);</span>
2427  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2428  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">elem</span><span class="special">);</span>
2429  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2430  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&amp;</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&lt;&gt;">Class
2436            template <code class="computeroutput"><span class="identifier">sync_queue</span><span class="special">&lt;&gt;</span></code></a>
2437</h6></div></div></div>
2438<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;</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">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&gt;</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">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
2451    <span class="identifier">sync_queue</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">sync_queue</span> <span class="keyword">const</span><span class="special">&amp;)</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Range</span><span class="special">&gt;</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">&amp;</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">&amp;&amp;</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">&amp;</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">&amp;&amp;)</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">&amp;</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">&amp;&amp;</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">&amp;);</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">&amp;);</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">&amp;);</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&lt;&lt;()">Non-Member
2544            Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;()</span></code></a>
2545</h6></div></div></div>
2546<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2550  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span><span class="special">&amp;&amp;</span> <span class="identifier">elem</span><span class="special">);</span>
2551  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2552  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="keyword">const</span><span class="special">&amp;</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&gt;&gt;()">Non-Member
2559            Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;()</span></code></a>
2560</h6></div></div></div>
2561<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">sync_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">&gt;</span>
2565  <span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">sync_queue</span><span class="special">&lt;</span><span class="identifier">ValueType</span><span class="special">&gt;&amp;</span> <span class="identifier">sbq</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">&amp;</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