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>Examples</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="../lockfree.html" title="Chapter 22. Boost.Lockfree"> 10<link rel="prev" href="../lockfree.html" title="Chapter 22. Boost.Lockfree"> 11<link rel="next" href="rationale.html" title="Rationale"> 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="../lockfree.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../lockfree.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="rationale.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="lockfree.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a> 29</h2></div></div></div> 30<h3> 31<a name="lockfree.examples.h0"></a> 32 <span class="phrase"><a name="lockfree.examples.queue"></a></span><a class="link" href="examples.html#lockfree.examples.queue">Queue</a> 33 </h3> 34<p> 35 The <code class="computeroutput"><a class="link" href="../boost/lockfree/queue.html" title="Class template queue">boost::lockfree::queue</a></code> 36 class implements a multi-writer/multi-reader queue. The following example shows 37 how integer values are produced and consumed by 4 threads each: 38 </p> 39<p> 40</p> 41<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 42<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">lockfree</span><span class="special">/</span><span class="identifier">queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 43<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 44 45<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 46 47<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic_int</span> <span class="identifier">producer_count</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 48<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic_int</span> <span class="identifier">consumer_count</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 49 50<span class="identifier">boost</span><span class="special">::</span><span class="identifier">lockfree</span><span class="special">::</span><span class="identifier">queue</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">queue</span><span class="special">(</span><span class="number">128</span><span class="special">);</span> 51 52<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">iterations</span> <span class="special">=</span> <span class="number">10000000</span><span class="special">;</span> 53<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">producer_thread_count</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> 54<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">consumer_thread_count</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> 55 56<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 57<span class="special">{</span> 58 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iterations</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 59 <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">=</span> <span class="special">++</span><span class="identifier">producer_count</span><span class="special">;</span> 60 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">queue</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 61 <span class="special">;</span> 62 <span class="special">}</span> 63<span class="special">}</span> 64 65<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="identifier">done</span> <span class="special">(</span><span class="keyword">false</span><span class="special">);</span> 66<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 67<span class="special">{</span> 68 <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> 69 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> 70 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">queue</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 71 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 72 <span class="special">}</span> 73 74 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">queue</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 75 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 76<span class="special">}</span> 77 78<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">argv</span><span class="special">[])</span> 79<span class="special">{</span> 80 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 81 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::queue is "</span><span class="special">;</span> 82 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">queue</span><span class="special">.</span><span class="identifier">is_lock_free</span><span class="special">())</span> 83 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> 84 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"lockfree"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 85 86 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_group</span> <span class="identifier">producer_threads</span><span class="special">,</span> <span class="identifier">consumer_threads</span><span class="special">;</span> 87 88 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">producer_thread_count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 89 <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">producer</span><span class="special">);</span> 90 91 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">consumer_thread_count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 92 <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">consumer</span><span class="special">);</span> 93 94 <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> 95 <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> 96 97 <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> 98 99 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"produced "</span> <span class="special"><<</span> <span class="identifier">producer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 100 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"consumed "</span> <span class="special"><<</span> <span class="identifier">consumer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 101<span class="special">}</span> 102</pre> 103<p> 104 </p> 105<p> 106 The program output is: 107 </p> 108<pre class="programlisting">produced 40000000 objects. 109consumed 40000000 objects. 110</pre> 111<h3> 112<a name="lockfree.examples.h1"></a> 113 <span class="phrase"><a name="lockfree.examples.stack"></a></span><a class="link" href="examples.html#lockfree.examples.stack">Stack</a> 114 </h3> 115<p> 116 The <code class="computeroutput"><a class="link" href="../boost/lockfree/stack.html" title="Class template stack">boost::lockfree::stack</a></code> 117 class implements a multi-writer/multi-reader stack. The following example shows 118 how integer values are produced and consumed by 4 threads each: 119 </p> 120<p> 121</p> 122<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 123<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">lockfree</span><span class="special">/</span><span class="identifier">stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 124<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 125 126<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 127 128<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic_int</span> <span class="identifier">producer_count</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 129<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic_int</span> <span class="identifier">consumer_count</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 130 131<span class="identifier">boost</span><span class="special">::</span><span class="identifier">lockfree</span><span class="special">::</span><span class="identifier">stack</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">stack</span><span class="special">(</span><span class="number">128</span><span class="special">);</span> 132 133<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">iterations</span> <span class="special">=</span> <span class="number">1000000</span><span class="special">;</span> 134<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">producer_thread_count</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> 135<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">consumer_thread_count</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> 136 137<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 138<span class="special">{</span> 139 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iterations</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 140 <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">=</span> <span class="special">++</span><span class="identifier">producer_count</span><span class="special">;</span> 141 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">stack</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 142 <span class="special">;</span> 143 <span class="special">}</span> 144<span class="special">}</span> 145 146<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="identifier">done</span> <span class="special">(</span><span class="keyword">false</span><span class="special">);</span> 147 148<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 149<span class="special">{</span> 150 <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> 151 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> 152 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 153 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 154 <span class="special">}</span> 155 156 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 157 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 158<span class="special">}</span> 159 160<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">argv</span><span class="special">[])</span> 161<span class="special">{</span> 162 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 163 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::stack is "</span><span class="special">;</span> 164 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">stack</span><span class="special">.</span><span class="identifier">is_lock_free</span><span class="special">())</span> 165 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> 166 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"lockfree"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 167 168 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_group</span> <span class="identifier">producer_threads</span><span class="special">,</span> <span class="identifier">consumer_threads</span><span class="special">;</span> 169 170 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">producer_thread_count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 171 <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">producer</span><span class="special">);</span> 172 173 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">consumer_thread_count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 174 <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">consumer</span><span class="special">);</span> 175 176 <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> 177 <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> 178 179 <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> 180 181 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"produced "</span> <span class="special"><<</span> <span class="identifier">producer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 182 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"consumed "</span> <span class="special"><<</span> <span class="identifier">consumer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 183<span class="special">}</span> 184</pre> 185<p> 186 </p> 187<p> 188 The program output is: 189 </p> 190<pre class="programlisting">produced 4000000 objects. 191consumed 4000000 objects. 192</pre> 193<h3> 194<a name="lockfree.examples.h2"></a> 195 <span class="phrase"><a name="lockfree.examples.waitfree_single_producer_single_consumer_queue"></a></span><a class="link" href="examples.html#lockfree.examples.waitfree_single_producer_single_consumer_queue">Waitfree 196 Single-Producer/Single-Consumer Queue</a> 197 </h3> 198<p> 199 The <code class="computeroutput"><a class="link" href="../boost/lockfree/spsc_queue.html" title="Class template spsc_queue">boost::lockfree::spsc_queue</a></code> 200 class implements a wait-free single-producer/single-consumer queue. The following 201 example shows how integer values are produced and consumed by 2 separate threads: 202 </p> 203<p> 204</p> 205<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 206<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">lockfree</span><span class="special">/</span><span class="identifier">spsc_queue</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 207<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 208 209<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 210 211<span class="keyword">int</span> <span class="identifier">producer_count</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 212<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic_int</span> <span class="identifier">consumer_count</span> <span class="special">(</span><span class="number">0</span><span class="special">);</span> 213 214<span class="identifier">boost</span><span class="special">::</span><span class="identifier">lockfree</span><span class="special">::</span><span class="identifier">spsc_queue</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lockfree</span><span class="special">::</span><span class="identifier">capacity</span><span class="special"><</span><span class="number">1024</span><span class="special">></span> <span class="special">></span> <span class="identifier">spsc_queue</span><span class="special">;</span> 215 216<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">iterations</span> <span class="special">=</span> <span class="number">10000000</span><span class="special">;</span> 217 218<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 219<span class="special">{</span> 220 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iterations</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 221 <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">=</span> <span class="special">++</span><span class="identifier">producer_count</span><span class="special">;</span> 222 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">spsc_queue</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 223 <span class="special">;</span> 224 <span class="special">}</span> 225<span class="special">}</span> 226 227<span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="identifier">done</span> <span class="special">(</span><span class="keyword">false</span><span class="special">);</span> 228 229<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> 230<span class="special">{</span> 231 <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> 232 <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> 233 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">spsc_queue</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 234 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 235 <span class="special">}</span> 236 237 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">spsc_queue</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> 238 <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> 239<span class="special">}</span> 240 241<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">argv</span><span class="special">[])</span> 242<span class="special">{</span> 243 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 244 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::queue is "</span><span class="special">;</span> 245 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">spsc_queue</span><span class="special">.</span><span class="identifier">is_lock_free</span><span class="special">())</span> 246 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> 247 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"lockfree"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 248 249 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">producer_thread</span><span class="special">(</span><span class="identifier">producer</span><span class="special">);</span> 250 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">consumer_thread</span><span class="special">(</span><span class="identifier">consumer</span><span class="special">);</span> 251 252 <span class="identifier">producer_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 253 <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> 254 <span class="identifier">consumer_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 255 256 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"produced "</span> <span class="special"><<</span> <span class="identifier">producer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 257 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"consumed "</span> <span class="special"><<</span> <span class="identifier">consumer_count</span> <span class="special"><<</span> <span class="string">" objects."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 258<span class="special">}</span> 259</pre> 260<p> 261 </p> 262<p> 263 The program output is: 264 </p> 265<pre class="programlisting">produced 10000000 objects. 266consumed 10000000 objects. 267</pre> 268</div> 269<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 270<td align="left"></td> 271<td align="right"><div class="copyright-footer">Copyright © 2008-2011 Tim 272 Blechmann<p> 273 Distributed under the Boost Software License, Version 1.0. (See accompanying 274 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>) 275 </p> 276</div></td> 277</tr></table> 278<hr> 279<div class="spirit-nav"> 280<a accesskey="p" href="../lockfree.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../lockfree.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="rationale.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 281</div> 282</body> 283</html> 284