diff options
author | Chanho Park <chanho61.park@samsung.com> | 2014-12-11 18:55:56 +0900 |
---|---|---|
committer | Chanho Park <chanho61.park@samsung.com> | 2014-12-11 18:55:56 +0900 |
commit | 08c1e93fa36a49f49325a07fe91ff92c964c2b6c (patch) | |
tree | 7a7053ceb8874b28ec4b868d4c49b500008a102e /doc/html/lockfree | |
parent | bb4dd8289b351fae6b55e303f189127a394a1edd (diff) | |
download | boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.gz boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.bz2 boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.zip |
Imported Upstream version 1.57.0upstream/1.57.0
Diffstat (limited to 'doc/html/lockfree')
-rw-r--r-- | doc/html/lockfree/appendices.html | 98 | ||||
-rw-r--r-- | doc/html/lockfree/examples.html | 282 | ||||
-rw-r--r-- | doc/html/lockfree/rationale.html | 131 | ||||
-rw-r--r-- | doc/html/lockfree/reference.html | 89 |
4 files changed, 600 insertions, 0 deletions
diff --git a/doc/html/lockfree/appendices.html b/doc/html/lockfree/appendices.html new file mode 100644 index 0000000000..a330c52592 --- /dev/null +++ b/doc/html/lockfree/appendices.html @@ -0,0 +1,98 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Appendices</title> +<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> +<link rel="up" href="../lockfree.html" title="Chapter 18. Boost.Lockfree"> +<link rel="prev" href="../boost/lockfree/stack.html" title="Class template stack"> +<link rel="next" href="../move.html" title="Chapter 19. Boost.Move"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> +<td align="center"><a href="../../../index.html">Home</a></td> +<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../boost/lockfree/stack.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="../move.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="lockfree.appendices"></a><a class="link" href="appendices.html" title="Appendices">Appendices</a> +</h2></div></div></div> +<div class="toc"><dl class="toc"> +<dt><span class="section"><a href="appendices.html#lockfree.appendices.supported_platforms___compilers">Supported + Platforms & Compilers</a></span></dt> +<dt><span class="section"><a href="appendices.html#lockfree.appendices.future_developments">Future Developments</a></span></dt> +<dt><span class="section"><a href="appendices.html#lockfree.appendices.references">References</a></span></dt> +</dl></div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.appendices.supported_platforms___compilers"></a><a class="link" href="appendices.html#lockfree.appendices.supported_platforms___compilers" title="Supported Platforms & Compilers">Supported + Platforms & Compilers</a> +</h3></div></div></div> +<p> + <code class="literal">boost.lockfree</code> has been tested on the following platforms: + </p> +<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> +<li class="listitem"> + g++ 4.4, 4.5 and 4.6, linux, x86 & x86_64 + </li> +<li class="listitem"> + clang++ 3.0, linux, x86 & x86_64 + </li> +</ul></div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.appendices.future_developments"></a><a class="link" href="appendices.html#lockfree.appendices.future_developments" title="Future Developments">Future Developments</a> +</h3></div></div></div> +<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> +<li class="listitem"> + More data structures (set, hash table, dequeue) + </li> +<li class="listitem"> + Backoff schemes (exponential backoff or elimination) + </li> +</ul></div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.appendices.references"></a><a class="link" href="appendices.html#lockfree.appendices.references" title="References">References</a> +</h3></div></div></div> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.37.3574" target="_top">Simple, + Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms + by Michael Scott and Maged Michael</a>, In Symposium on Principles + of Distributed Computing, pages 267–275, 1996. + </li> +<li class="listitem"> + <a href="http://books.google.com/books?id=pFSwuqtJgxYC" target="_top">M. Herlihy + & Nir Shavit. The Art of Multiprocessor Programming</a>, Morgan + Kaufmann Publishers, 2008 + </li> +</ol></div> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2008-2011 Tim + Blechmann<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + 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>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../boost/lockfree/stack.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="../move.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/doc/html/lockfree/examples.html b/doc/html/lockfree/examples.html new file mode 100644 index 0000000000..f0162176d0 --- /dev/null +++ b/doc/html/lockfree/examples.html @@ -0,0 +1,282 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Examples</title> +<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> +<link rel="up" href="../lockfree.html" title="Chapter 18. Boost.Lockfree"> +<link rel="prev" href="../lockfree.html" title="Chapter 18. Boost.Lockfree"> +<link rel="next" href="rationale.html" title="Rationale"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> +<td align="center"><a href="../../../index.html">Home</a></td> +<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<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> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="lockfree.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a> +</h2></div></div></div> +<h3> +<a name="lockfree.examples.h0"></a> + <span class="phrase"><a name="lockfree.examples.queue"></a></span><a class="link" href="examples.html#lockfree.examples.queue">Queue</a> + </h3> +<p> + The <code class="computeroutput"><a class="link" href="../boost/lockfree/queue.html" title="Class template queue">boost::lockfree::queue</a></code> + class implements a multi-writer/multi-reader queue. The following example shows + how integer values are produced and consumed by 4 threads each: + </p> +<p> +</p> +<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> +<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> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> + +<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> + +<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> +<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> + +<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> + +<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> +<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> +<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> + +<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <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> + <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> + <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> + <span class="special">;</span> + <span class="special">}</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="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> +<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> + <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> + <span class="special">}</span> + + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> +<span class="special">}</span> + +<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> +<span class="special">{</span> + <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::queue is "</span><span class="special">;</span> + <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> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> + <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> + + <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> + + <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> + <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> + + <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> + <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> + + <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> + <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> + + <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> + + <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> + <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> +<span class="special">}</span> +</pre> +<p> + </p> +<p> + The program output is: + </p> +<pre class="programlisting">produced 40000000 objects. +consumed 40000000 objects. +</pre> +<h3> +<a name="lockfree.examples.h1"></a> + <span class="phrase"><a name="lockfree.examples.stack"></a></span><a class="link" href="examples.html#lockfree.examples.stack">Stack</a> + </h3> +<p> + The <code class="computeroutput"><a class="link" href="../boost/lockfree/stack.html" title="Class template stack">boost::lockfree::stack</a></code> + class implements a multi-writer/multi-reader stack. The following example shows + how integer values are produced and consumed by 4 threads each: + </p> +<p> +</p> +<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> +<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> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> + +<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> + +<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> +<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> + +<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> + +<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> +<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> +<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> + +<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <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> + <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> + <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> + <span class="special">;</span> + <span class="special">}</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="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> + +<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> + <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> + <span class="special">}</span> + + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> +<span class="special">}</span> + +<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> +<span class="special">{</span> + <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::stack is "</span><span class="special">;</span> + <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> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> + <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> + + <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> + + <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> + <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> + + <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> + <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> + + <span class="identifier">producer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> + <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> + + <span class="identifier">consumer_threads</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span> + + <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> + <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> +<span class="special">}</span> +</pre> +<p> + </p> +<p> + The program output is: + </p> +<pre class="programlisting">produced 4000000 objects. +consumed 4000000 objects. +</pre> +<h3> +<a name="lockfree.examples.h2"></a> + <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 + Single-Producer/Single-Consumer Queue</a> + </h3> +<p> + The <code class="computeroutput"><a class="link" href="../boost/lockfree/spsc_queue.html" title="Class template spsc_queue">boost::lockfree::spsc_queue</a></code> + class implements a wait-free single-producer/single-consumer queue. The following + example shows how integer values are produced and consumed by 2 separate threads: + </p> +<p> +</p> +<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> +<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> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> + +<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> + +<span class="keyword">int</span> <span class="identifier">producer_count</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> +<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> + +<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> + +<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> + +<span class="keyword">void</span> <span class="identifier">producer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <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> + <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> + <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> + <span class="special">;</span> + <span class="special">}</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="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> + +<span class="keyword">void</span> <span class="identifier">consumer</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> + <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">done</span><span class="special">)</span> <span class="special">{</span> + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> + <span class="special">}</span> + + <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> + <span class="special">++</span><span class="identifier">consumer_count</span><span class="special">;</span> +<span class="special">}</span> + +<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> +<span class="special">{</span> + <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"boost::lockfree::queue is "</span><span class="special">;</span> + <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> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"not "</span><span class="special">;</span> + <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> + + <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> + <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> + + <span class="identifier">producer_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> + <span class="identifier">done</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> + <span class="identifier">consumer_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> + + <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> + <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> +<span class="special">}</span> +</pre> +<p> + </p> +<p> + The program output is: + </p> +<pre class="programlisting">produced 10000000 objects. +consumed 10000000 objects. +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2008-2011 Tim + Blechmann<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + 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>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<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> +</div> +</body> +</html> diff --git a/doc/html/lockfree/rationale.html b/doc/html/lockfree/rationale.html new file mode 100644 index 0000000000..411d422250 --- /dev/null +++ b/doc/html/lockfree/rationale.html @@ -0,0 +1,131 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Rationale</title> +<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> +<link rel="up" href="../lockfree.html" title="Chapter 18. Boost.Lockfree"> +<link rel="prev" href="examples.html" title="Examples"> +<link rel="next" href="reference.html" title="Reference"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> +<td align="center"><a href="../../../index.html">Home</a></td> +<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="examples.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="lockfree.rationale"></a><a class="link" href="rationale.html" title="Rationale">Rationale</a> +</h2></div></div></div> +<div class="toc"><dl class="toc"> +<dt><span class="section"><a href="rationale.html#lockfree.rationale.data_structures">Data Structures</a></span></dt> +<dt><span class="section"><a href="rationale.html#lockfree.rationale.memory_management">Memory Management</a></span></dt> +<dt><span class="section"><a href="rationale.html#lockfree.rationale.aba_prevention">ABA Prevention</a></span></dt> +<dt><span class="section"><a href="rationale.html#lockfree.rationale.interprocess_support">Interprocess + Support</a></span></dt> +</dl></div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.rationale.data_structures"></a><a class="link" href="rationale.html#lockfree.rationale.data_structures" title="Data Structures">Data Structures</a> +</h3></div></div></div> +<p> + The implementations are implementations of well-known data structures. The + queue is based on <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.37.3574" target="_top">Simple, + Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms + by Michael Scott and Maged Michael</a>, the stack is based on <a href="http://books.google.com/books?id=YQg3HAAACAAJ" target="_top">Systems programming: + coping with parallelism by R. K. Treiber</a> and the spsc_queue is considered + as 'folklore' and is implemented in several open-source projects including + the linux kernel. All data structures are discussed in detail in <a href="http://books.google.com/books?id=pFSwuqtJgxYC" target="_top">"The + Art of Multiprocessor Programming" by Herlihy & Shavit</a>. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.rationale.memory_management"></a><a class="link" href="rationale.html#lockfree.rationale.memory_management" title="Memory Management">Memory Management</a> +</h3></div></div></div> +<p> + The lock-free <code class="computeroutput"><a class="link" href="../boost/lockfree/queue.html" title="Class template queue">boost::lockfree::queue</a></code> + and <code class="computeroutput"><a class="link" href="../boost/lockfree/stack.html" title="Class template stack">boost::lockfree::stack</a></code> + classes are node-based data structures, based on a linked list. Memory management + of lock-free data structures is a non-trivial problem, because we need to + avoid that one thread frees an internal node, while another thread still + uses it. <code class="literal">boost.lockfree</code> uses a simple approach not returning + any memory to the operating system. Instead they maintain a <span class="bold"><strong>free-list</strong></span> + in order to reuse them later. This is done for two reasons: first, depending + on the implementation of the memory allocator freeing the memory may block + (so the implementation would not be lock-free anymore), and second, most + memory reclamation algorithms are patented. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.rationale.aba_prevention"></a><a class="link" href="rationale.html#lockfree.rationale.aba_prevention" title="ABA Prevention">ABA Prevention</a> +</h3></div></div></div> +<p> + The ABA problem is a common problem when implementing lock-free data structures. + The problem occurs when updating an atomic variable using a <code class="literal">compare_exchange</code> + operation: if the value A was read, thread 1 changes it to say C and tries + to update the variable, it uses <code class="literal">compare_exchange</code> to write + C, only if the current value is A. This might be a problem if in the meanwhile + thread 2 changes the value from A to B and back to A, because thread 1 does + not observe the change of the state. The common way to avoid the ABA problem + is to associate a version counter with the value and change both atomically. + </p> +<p> + <code class="literal">boost.lockfree</code> uses a <code class="literal">tagged_ptr</code> helper + class which associates a pointer with an integer tag. This usually requires + a double-width <code class="literal">compare_exchange</code>, which is not available + on all platforms. IA32 did not provide the <code class="literal">cmpxchg8b</code> opcode + before the pentium processor and it is also lacking on many RISC architectures + like PPC. Early X86-64 processors also did not provide a <code class="literal">cmpxchg16b</code> + instruction. On 64bit platforms one can work around this issue, because often + not the full 64bit address space is used. On X86_64 for example, only 48bit + are used for the address, so we can use the remaining 16bit for the ABA prevention + tag. For details please consult the implementation of the <code class="literal">boost::lockfree::detail::tagged_ptr</code> + class. + </p> +<p> + For lock-free operations on 32bit platforms without double-width <code class="literal">compare_exchange</code>, + we support a third approach: by using a fixed-sized array to store the internal + nodes we can avoid the use of 32bit pointers, but instead 16bit indices into + the array are sufficient. However this is only possible for fixed-sized data + structures, that have an upper bound of internal nodes. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="lockfree.rationale.interprocess_support"></a><a class="link" href="rationale.html#lockfree.rationale.interprocess_support" title="Interprocess Support">Interprocess + Support</a> +</h3></div></div></div> +<p> + The <code class="literal">boost.lockfree</code> data structures have basic support + for <a href="../../../libs/interprocess/index.html" target="_top">Boost.Interprocess</a>. + The only problem is the blocking emulation of lock-free atomics, which in + the current implementation is not guaranteed to be interprocess-safe. + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2008-2011 Tim + Blechmann<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + 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>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="examples.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/doc/html/lockfree/reference.html b/doc/html/lockfree/reference.html new file mode 100644 index 0000000000..c8131b08e8 --- /dev/null +++ b/doc/html/lockfree/reference.html @@ -0,0 +1,89 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Reference</title> +<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> +<link rel="up" href="../lockfree.html" title="Chapter 18. Boost.Lockfree"> +<link rel="prev" href="rationale.html" title="Rationale"> +<link rel="next" href="../boost/lockfree/fixed_sized.html" title="Struct template fixed_sized"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> +<td align="center"><a href="../../../index.html">Home</a></td> +<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="rationale.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="../boost/lockfree/fixed_sized.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="lockfree.reference"></a>Reference</h2></div></div></div> +<div class="toc"><dl class="toc"> +<dt><span class="section"><a href="reference.html#header.boost.lockfree.policies_hpp">Header <boost/lockfree/policies.hpp></a></span></dt> +<dt><span class="section"><a href="reference.html#header.boost.lockfree.queue_hpp">Header <boost/lockfree/queue.hpp></a></span></dt> +<dt><span class="section"><a href="reference.html#header.boost.lockfree.spsc_queue_hpp">Header <boost/lockfree/spsc_queue.hpp></a></span></dt> +<dt><span class="section"><a href="reference.html#header.boost.lockfree.stack_hpp">Header <boost/lockfree/stack.hpp></a></span></dt> +</dl></div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="header.boost.lockfree.policies_hpp"></a>Header <<a href="../../../boost/lockfree/policies.hpp" target="_top">boost/lockfree/policies.hpp</a>></h3></div></div></div> +<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> + <span class="keyword">namespace</span> <span class="identifier">lockfree</span> <span class="special">{</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">bool</span> IsFixedSized<span class="special">></span> <span class="keyword">struct</span> <a class="link" href="../boost/lockfree/fixed_sized.html" title="Struct template fixed_sized">fixed_sized</a><span class="special">;</span> + <span class="keyword">template</span><span class="special"><</span><span class="identifier">size_t</span> Size<span class="special">></span> <span class="keyword">struct</span> <a class="link" href="../boost/lockfree/capacity.html" title="Struct template capacity">capacity</a><span class="special">;</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> Alloc<span class="special">></span> <span class="keyword">struct</span> <a class="link" href="../boost/lockfree/allocator.html" title="Struct template allocator">allocator</a><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span></pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="header.boost.lockfree.queue_hpp"></a>Header <<a href="../../../boost/lockfree/queue.hpp" target="_top">boost/lockfree/queue.hpp</a>></h3></div></div></div> +<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> + <span class="keyword">namespace</span> <span class="identifier">lockfree</span> <span class="special">{</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="special">...</span> Options<span class="special">></span> <span class="keyword">class</span> <a class="link" href="../boost/lockfree/queue.html" title="Class template queue">queue</a><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span></pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="header.boost.lockfree.spsc_queue_hpp"></a>Header <<a href="../../../boost/lockfree/spsc_queue.hpp" target="_top">boost/lockfree/spsc_queue.hpp</a>></h3></div></div></div> +<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> + <span class="keyword">namespace</span> <span class="identifier">lockfree</span> <span class="special">{</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> A0 <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">parameter</span><span class="special">::</span><span class="identifier">void_</span><span class="special">,</span> + <span class="keyword">typename</span> A1 <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">parameter</span><span class="special">::</span><span class="identifier">void_</span><span class="special">></span> + <span class="keyword">class</span> <a class="link" href="../boost/lockfree/spsc_queue.html" title="Class template spsc_queue">spsc_queue</a><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span></pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="header.boost.lockfree.stack_hpp"></a>Header <<a href="../../../boost/lockfree/stack.hpp" target="_top">boost/lockfree/stack.hpp</a>></h3></div></div></div> +<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> + <span class="keyword">namespace</span> <span class="identifier">lockfree</span> <span class="special">{</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="special">...</span> Options<span class="special">></span> <span class="keyword">class</span> <a class="link" href="../boost/lockfree/stack.html" title="Class template stack">stack</a><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span></pre> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2008-2011 Tim + Blechmann<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + 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>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="rationale.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="../boost/lockfree/fixed_sized.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> |