|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r56762 - in sandbox/interthreads: doc doc/html doc/html/images doc/html/images/callouts libs/interthreads/build libs/interthreads/doc libs/interthreads/doc/html libs/interthreads/doc/html/toward_boost_interthreads libs/interthreads/doc/html/toward_boost_interthreads/appendices libs/interthreads/doc/html/toward_boost_interthreads/examples libs/interthreads/doc/html/toward_boost_interthreads/overview libs/interthreads/doc/html/toward_boost_interthreads/reference libs/interthreads/doc/html/toward_boost_interthreads/users_guide libs/interthreads/doc/reference libs/interthreads/test
From: vicente.botet_at_[hidden]
Date: 2009-10-12 17:42:31
Author: viboes
Date: 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
New Revision: 56762
URL: http://svn.boost.org/trac/boost/changeset/56762
Log:
TBoost.Interthreads:
* Added doc
Added:
sandbox/interthreads/doc/
sandbox/interthreads/doc/html/
sandbox/interthreads/doc/html/boostbook.css (contents, props changed)
sandbox/interthreads/doc/html/images/
sandbox/interthreads/doc/html/images/Thumbs.db (contents, props changed)
sandbox/interthreads/doc/html/images/alert.png (contents, props changed)
sandbox/interthreads/doc/html/images/blank.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/
sandbox/interthreads/doc/html/images/callouts/1.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/10.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/11.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/12.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/13.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/14.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/15.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/2.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/3.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/4.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/5.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/6.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/7.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/8.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/9.png (contents, props changed)
sandbox/interthreads/doc/html/images/callouts/Thumbs.db (contents, props changed)
sandbox/interthreads/doc/html/images/caution.png (contents, props changed)
sandbox/interthreads/doc/html/images/draft.png (contents, props changed)
sandbox/interthreads/doc/html/images/home.png (contents, props changed)
sandbox/interthreads/doc/html/images/important.png (contents, props changed)
sandbox/interthreads/doc/html/images/next.png (contents, props changed)
sandbox/interthreads/doc/html/images/next_disabled.png (contents, props changed)
sandbox/interthreads/doc/html/images/note.png (contents, props changed)
sandbox/interthreads/doc/html/images/prev.png (contents, props changed)
sandbox/interthreads/doc/html/images/prev_disabled.png (contents, props changed)
sandbox/interthreads/doc/html/images/smiley.png (contents, props changed)
sandbox/interthreads/doc/html/images/tip.png (contents, props changed)
sandbox/interthreads/doc/html/images/toc-blank.png (contents, props changed)
sandbox/interthreads/doc/html/images/toc-minus.png (contents, props changed)
sandbox/interthreads/doc/html/images/toc-plus.png (contents, props changed)
sandbox/interthreads/doc/html/images/up.png (contents, props changed)
sandbox/interthreads/doc/html/images/up_disabled.png (contents, props changed)
sandbox/interthreads/doc/html/images/warning.png (contents, props changed)
sandbox/interthreads/doc/html/reference.css (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/
sandbox/interthreads/libs/interthreads/doc/html/index.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/standalone_HTML.manifest (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/acknowledgements.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/changes.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/implementation.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/rationale.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tests.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tickets.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/todo.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/stm.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/thread_safe_deferred_traces.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview/motivation.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/concepts.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_array_reference.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_extensions_reference.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/bibliography.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/getting_started.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/glosary.html (contents, props changed)
sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/tutorial.html (contents, props changed)
Text files modified:
sandbox/interthreads/libs/interthreads/build/Jamfile.v2 | 2
sandbox/interthreads/libs/interthreads/doc/acknowledgements.qbk | 3
sandbox/interthreads/libs/interthreads/doc/appendices.qbk | 54 ----
sandbox/interthreads/libs/interthreads/doc/case_studies.qbk | 304 +++++++++----------------
sandbox/interthreads/libs/interthreads/doc/changes.qbk | 157 -------------
sandbox/interthreads/libs/interthreads/doc/concepts.qbk | 457 ----------------------------------------
sandbox/interthreads/libs/interthreads/doc/getting_started.qbk | 54 ----
sandbox/interthreads/libs/interthreads/doc/implementation.qbk | 14
sandbox/interthreads/libs/interthreads/doc/installation.qbk | 22 -
sandbox/interthreads/libs/interthreads/doc/interthreads.qbk | 2
sandbox/interthreads/libs/interthreads/doc/introduction.qbk | 414 ------------------------------------
sandbox/interthreads/libs/interthreads/doc/models.qbk | 256 ----------------------
sandbox/interthreads/libs/interthreads/doc/overview.qbk | 34 --
sandbox/interthreads/libs/interthreads/doc/rationale.qbk | 4
sandbox/interthreads/libs/interthreads/doc/reference.qbk | 76 ------
sandbox/interthreads/libs/interthreads/doc/reference/thread_decorator.qbk | 22 +
sandbox/interthreads/libs/interthreads/doc/reference/thread_keep_alive.qbk | 12 +
sandbox/interthreads/libs/interthreads/doc/reference/thread_specific_shared_ptr.qbk | 11
sandbox/interthreads/libs/interthreads/doc/tests.qbk | 40 ---
sandbox/interthreads/libs/interthreads/doc/tickets.qbk | 60 ----
sandbox/interthreads/libs/interthreads/doc/tutorial.qbk | 4
sandbox/interthreads/libs/interthreads/doc/users_guide.qbk | 17 -
sandbox/interthreads/libs/interthreads/test/Jamfile.v2 | 13
23 files changed, 178 insertions(+), 1854 deletions(-)
Added: sandbox/interthreads/doc/html/boostbook.css
==============================================================================
--- (empty file)
+++ sandbox/interthreads/doc/html/boostbook.css 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,538 @@
+/*=============================================================================
+ Copyright (c) 2004 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Use, modification and distribution is subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+/*=============================================================================
+ Body defaults
+=============================================================================*/
+
+ body
+ {
+ margin: 1em;
+ font-family: sans-serif;
+ }
+
+/*=============================================================================
+ Paragraphs
+=============================================================================*/
+
+ p
+ {
+ text-align: left;
+ font-size: 10pt;
+ line-height: 1.15;
+ }
+
+/*=============================================================================
+ Program listings
+=============================================================================*/
+
+ /* Code on paragraphs */
+ p tt.computeroutput
+ {
+ font-size: 10pt;
+ }
+
+ pre.synopsis
+ {
+ font-size: 10pt;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+ .programlisting,
+ .screen
+ {
+ font-size: 10pt;
+ display: block;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+/*=============================================================================
+ Headings
+=============================================================================*/
+
+ h1, h2, h3, h4, h5, h6
+ {
+ text-align: left;
+ margin: 1em 0em 0.5em 0em;
+ font-weight: bold;
+ }
+
+ h1 { font: 140% }
+ h2 { font: bold 140% }
+ h3 { font: bold 130% }
+ h4 { font: bold 120% }
+ h5 { font: italic 110% }
+ h6 { font: italic 100% }
+
+ /* Top page titles */
+ title,
+ h1.title,
+ h2.title
+ h3.title,
+ h4.title,
+ h5.title,
+ h6.title,
+ .refentrytitle
+ {
+ font-weight: bold;
+ margin-bottom: 1pc;
+ }
+
+ h1.title { font-size: 140% }
+ h2.title { font-size: 140% }
+ h3.title { font-size: 130% }
+ h4.title { font-size: 120% }
+ h5.title { font-size: 110% }
+ h6.title { font-size: 100% }
+
+ .section h1
+ {
+ margin: 0em 0em 0.5em 0em;
+ font-size: 140%;
+ }
+
+ .section h2 { font-size: 140% }
+ .section h3 { font-size: 130% }
+ .section h4 { font-size: 120% }
+ .section h5 { font-size: 110% }
+ .section h6 { font-size: 100% }
+
+ /* Code on titles */
+ h1 tt.computeroutput { font-size: 140% }
+ h2 tt.computeroutput { font-size: 140% }
+ h3 tt.computeroutput { font-size: 130% }
+ h4 tt.computeroutput { font-size: 120% }
+ h5 tt.computeroutput { font-size: 110% }
+ h6 tt.computeroutput { font-size: 100% }
+
+/*=============================================================================
+ Author
+=============================================================================*/
+
+ h3.author
+ {
+ font-size: 100%
+ }
+
+/*=============================================================================
+ Lists
+=============================================================================*/
+
+ li
+ {
+ font-size: 10pt;
+ line-height: 1.3;
+ }
+
+ /* Unordered lists */
+ ul
+ {
+ text-align: left;
+ }
+
+ /* Ordered lists */
+ ol
+ {
+ text-align: left;
+ }
+
+/*=============================================================================
+ Links
+=============================================================================*/
+
+ a
+ {
+ text-decoration: none; /* no underline */
+ }
+
+ a:hover
+ {
+ text-decoration: underline;
+ }
+
+/*=============================================================================
+ Spirit style navigation
+=============================================================================*/
+
+ .spirit-nav
+ {
+ text-align: right;
+ }
+
+ .spirit-nav a
+ {
+ color: white;
+ padding-left: 0.5em;
+ }
+
+ .spirit-nav img
+ {
+ border-width: 0px;
+ }
+
+/*=============================================================================
+ Table of contents
+=============================================================================*/
+
+ .toc
+ {
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.1pc 1pc 0.1pc 1pc;
+ font-size: 10pt;
+ line-height: 1.15;
+ }
+
+ .toc-main
+ {
+ width: 600;
+ text-align: center;
+ margin: 1pc 1pc 1pc 10%;
+ padding: 2pc 1pc 3pc 1pc;
+ line-height: 0.1;
+ }
+
+ .boost-toc
+ {
+ float: right;
+ padding: 0.5pc;
+ }
+
+/*=============================================================================
+ Tables
+=============================================================================*/
+
+ .table-title,
+ div.table p.title
+ {
+ margin-left: 4%;
+ padding-right: 0.5em;
+ padding-left: 0.5em;
+ }
+
+ .informaltable table,
+ .table table
+ {
+ width: 92%;
+ margin-left: 4%;
+ margin-right: 4%;
+ }
+
+ div.informaltable table,
+ div.table table
+ {
+ padding: 4px;
+ }
+
+ /* Table Cells */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ padding: 0.5em;
+ text-align: left;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ padding: 0.5em 0.5em 0.5em 0.5em;
+ border: 1pt solid white;
+ font-size: 120%;
+ }
+
+/*=============================================================================
+ Blurbs
+=============================================================================*/
+
+ div.note,
+ div.tip,
+ div.important,
+ div.caution,
+ div.warning,
+ p.blurb
+ {
+ font-size: 10pt;
+ line-height: 1.2;
+ display: block;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+ p.blurb img
+ {
+ padding: 1pt;
+ }
+
+/*=============================================================================
+ Variable Lists
+=============================================================================*/
+
+ span.term
+ {
+ font-weight: bold;
+ font-size: 10pt;
+ }
+
+ div.variablelist table tbody tr td
+ {
+ text-align: left;
+ vertical-align: top;
+ padding: 0em 2em 0em 0em;
+ font-size: 10pt;
+ }
+
+ div.variablelist table tbody tr td p
+ {
+ margin: 0em 0em 0.5em 0em;
+ }
+
+ /* Make the terms in definition lists bold */
+ div.variablelist dl dt
+ {
+ font-weight: bold;
+ font-size: 10pt;
+ }
+
+ div.variablelist dl dd
+ {
+ margin: 1em 0em 1em 2em;
+ font-size: 10pt;
+ }
+
+/*=============================================================================
+ Misc
+=============================================================================*/
+
+ /* Title of books and articles in bibliographies */
+ span.title
+ {
+ font-style: italic;
+ }
+
+ span.underline
+ {
+ text-decoration: underline;
+ }
+
+ span.strikethrough
+ {
+ text-decoration: line-through;
+ }
+
+ /* Copyright, Legal Notice */
+ div div.legalnotice p
+ {
+ font-size: 8pt;
+ text-align: left
+ }
+
+/*=============================================================================
+ Colors
+=============================================================================*/
+
+ @media screen
+ {
+ /* Links */
+ a
+ {
+ color: #0C7445;
+ }
+
+ a:visited
+ {
+ color: #663974;
+ }
+
+ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+ h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
+ h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
+ {
+ text-decoration: none; /* no underline */
+ color: #000000;
+ }
+
+ /* Syntax Highlighting */
+ .keyword { color: #0000AA; }
+ .identifier { color: #000000; }
+ .special { color: #707070; }
+ .preprocessor { color: #402080; }
+ .char { color: teal; }
+ .comment { color: #800000; }
+ .string { color: teal; }
+ .number { color: teal; }
+ .white_bkd { background-color: #E8FBE9; }
+ .dk_grey_bkd { background-color: #A0DAAC; }
+
+ /* Copyright, Legal Notice */
+ .copyright
+ {
+ color: #666666;
+ font-size: small;
+ }
+
+ div div.legalnotice p
+ {
+ color: #666666;
+ }
+
+ /* Program listing */
+ pre.synopsis
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ .programlisting,
+ .screen
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ /* Blurbs */
+ div.note,
+ div.tip,
+ div.important,
+ div.caution,
+ div.warning,
+ p.blurb
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ /* Table of contents */
+ .toc
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ /* Table of contents */
+ .toc-main
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+
+ /* Tables */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ border: 1px solid #DCDCDC;
+ background-color: #FAFFFB;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ background-color: #E3F9E4;
+ border: 1px solid #DCDCDC;
+ }
+
+ /* Misc */
+ span.highlight
+ {
+ color: #00A000;
+ }
+ }
+
+ @media print
+ {
+ /* Links */
+ a
+ {
+ color: black;
+ }
+
+ a:visited
+ {
+ color: black;
+ }
+
+ .spirit-nav
+ {
+ display: none;
+ }
+
+ /* Program listing */
+ pre.synopsis
+ {
+ border: 1px solid gray;
+ background-color: #FAFFFB;
+ }
+
+ .programlisting,
+ .screen
+ {
+ border: 1px solid gray;
+ background-color: #FAFFFB;
+ }
+
+ /* Table of contents */
+ .toc
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ /* Table of contents */
+ .toc-main
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ background-color: #FAFFFB;
+ }
+
+ .informaltable table,
+ .table table
+ {
+ border: 1px solid #DCDCDC;
+ border-bottom: 3px solid #9D9D9D;
+ border-right: 3px solid #9D9D9D;
+ border-collapse: collapse;
+ background-color: #FAFFFB;
+ }
+
+ /* Tables */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ border: 1px solid #DCDCDC;
+ background-color: #FAFFFB;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ border: 1px solid #DCDCDC;
+ background-color: #FAFFFB;
+ }
+
+ /* Misc */
+ span.highlight
+ {
+ font-weight: bold;
+ }
+ }
Added: sandbox/interthreads/doc/html/images/Thumbs.db
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/alert.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/1.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/10.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/11.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/12.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/13.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/14.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/15.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/2.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/3.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/4.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/5.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/6.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/7.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/8.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/9.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/callouts/Thumbs.db
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/caution.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/draft.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/home.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/important.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/next.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/next_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/note.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/prev.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/prev_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/smiley.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/tip.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/toc-blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/toc-minus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/toc-plus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/up.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/up_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/images/warning.png
==============================================================================
Binary file. No diff available.
Added: sandbox/interthreads/doc/html/reference.css
==============================================================================
--- (empty file)
+++ sandbox/interthreads/doc/html/reference.css 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,13 @@
+/*=============================================================================
+ Copyright (c) 2004 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Use, modification and distribution is subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+PRE.synopsis {
+ background-color: #e0ffff;
+ border: thin solid blue;
+ padding: 1em
+}
Modified: sandbox/interthreads/libs/interthreads/build/Jamfile.v2
==============================================================================
--- sandbox/interthreads/libs/interthreads/build/Jamfile.v2 (original)
+++ sandbox/interthreads/libs/interthreads/build/Jamfile.v2 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -46,7 +46,7 @@
# <define>BOOST_THREAD_HAS_THREAD_ATTR
<include>../../..
- <include>/boost_1_39_0
+ <include>$BOOST_ROOT
<link>static:<define>BOOST_INTERTHREADS_BUILD_LIB=1
<link>shared:<define>BOOST_INTERTHREADS_BUILD_DLL=1
# <link>shared:<library>/boost/thread//boost_thread/<link>shared
Modified: sandbox/interthreads/libs/interthreads/doc/acknowledgements.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/acknowledgements.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/acknowledgements.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -13,9 +13,6 @@
Thanks also must go to Jochen Heckl for the ideas given respect to the thread_tuple::wait_first implementation.
-The Threader|Joiner design is taken from [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf N1833 - Preliminary Threading Library Proposal for TR2]
-Many thanks to Kevlin Henney to make evident to me the separation between asynchonous executors, and asynchronous completion tokens.
-
You can help me to make this library better! Any feedback is very welcome.
[endsect]
Modified: sandbox/interthreads/libs/interthreads/doc/appendices.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/appendices.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/appendices.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -27,87 +27,33 @@
[section Tasks to do before review]
-[heading Add an overloading for wait_for_all_in_sequence(ae, f, seq)]
-
-This will be quite useful on recursive algorithms evaluating asynchronously the same function on different parts.
-
- template <
- typename DirectSolver,
- typename Composer,
- typename AsynchronousExecutor,
- typename Input>
- void inplace_solve(AsynchronousExecutor& ae, Problem& input) {
- // if (problem is small)
- if (size(range) < concurrency_threshold) {
- // directly solve problem
- DirectSolver()(input);
- } else {
- // split problem into independent parts
- BOOST_AUTO(partition, partition_view(input));
- // evaluates asynchronously inplace_solve on each element of the partition
- // using the asynchronous executor as scheduler
- wait_for_all_in_sequence(ae, inplace_solve, partition);
- // compose the result in place from subresults
- Composer()(partition);
- }
- }
-
-
-[heading Add polymorphic act and adapters]
-When we need to chain __ACT__ using the fork_after the nature of the __ACT__ can change over time, an why not change also its
-template parameter. So at least we need to make polymorphic every function used by fork_after.
-
-[heading Use set_once to implement wait_for_any]
-The current implementation uses the Boost.Futures wait_for_any to implement this feauture, which add weigth constraint:
-be able to get a future from all the AE/ACT. As AE/ACT wait_for_any evaluates the function itselfs, he can decorate the
-function and signal the first one.]]
-
[heading Complete the tests]
Even if the current release include some test there is yet a long way before been able to review the library.]]
* change the test so they take less time using locks; conditions and variables.
-* Complete the test for the AE/ACT framework
* Add test with functions throwing
* Formalize the tests for thread_decoratoor
* Formalize the tests for thread_specific_shared_ptr
-* Add tests for asynchronous_executor_decorator, basic_threader_decorator and threader_decorator
* Add tests for keep alive mechanism
[heading Add more examples]
-* Use of the ae/act framework instead of thread_tuples in the Getting Started section.
* Complete the STM example.
-* A a parallel sort
* Change the implementation of the file on the async_ostream.
-[heading Complete the reference]
-
-* ae/act framework
-
[heading Change the rational and implementation sections]
[endsect]
[section For later releases]
-
-[heading Use Boost.Chrono]
-
[heading Add C++0x move semantics on compilers supporting it and use the Boost.Move emulation otherwise]
[heading Use C++0x variadic templates on compilers supporting it and use the preprocesor otherwise]
[heading Use C++0x Concepts on compilers supporting them and use the Boost.ConceptCheck or Boost.ConceptTraits otherwise]
-[heading Add Message queues]
-Messages queue are the next step concerning the communication between threads on the InterThreads library.]
-
-[heading Add Rendez-vous]
-Concurrent components may interact in different ways: they may access the same objects by, for example,
-executing functions of these objects; or they may communicate directly by executing functions of each other.
-These library will provide the so-called rendezvous mechanism for handling direct communication between active objects.]
-
[heading Add a daemon controlling all the keep alive controller threads]
This daemon will send regular keep_alive messages and kill the process when dead.
Modified: sandbox/interthreads/libs/interthreads/doc/case_studies.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/case_studies.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/case_studies.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -13,92 +13,6 @@
[/==================================]
-[section Parallel sort]
-[/==================================]
-
-Next follows a generic algorithm based on partitioning od a given problem in smaler problems, and compose a solution from the solution of the smaller problems.
-
- template <
- typename DirectSolver,
- typename Composer,
- typename AE,
- typename Range
- >
- void inplace_solve( AE & ae,
- boost::iterator_range<typename boost::range_iterator<Range>::type> range,
- unsigned cutoff );
-
- template <
- typename DirectSolver,
- typename Composer,
- typename AE,
- typename Range
- >
- void inplace_solve( AE & ae,
- boost::iterator_range<typename boost::range_iterator<Range>::type> range,
- unsigned cutoff )
- {
- unsigned size = boost::size(range);
- //std::cout << "<<par_ " << size;
- if ( size <= cutoff) DirectSolver()(range);
- else {
- partition<Range> parts(range, BOOST_PARTS);
-
- // wait_for_all_in_sequence(ae, &inplace_solve<DirectSolver,Composer,AE,Range>, parts);
- std::list<task_type> tasks;
- for (unsigned i=0;i < BOOST_PARTS-1; ++i) {
- task_type tmp(ae.submit(
- boost::bind(
- &inplace_solve<DirectSolver,Composer,AE,Range>,
- boost::ref(ae),
- parts[i],
- cutoff
- )));
- tasks.push_back(tmp);
- }
- inplace_solve<DirectSolver,Composer,AE,Range>(ae, parts[BOOST_PARTS-1], cutoff);
- boost::for_each(tasks, &boost::interthreads::wait_act<task_type>);
- // wait_for_all_in_sequence
-
- Composer()(range);
- }
- }
-
-
-So parallel sort could be
-
- struct sort_fct {
- template<class RandomAccessRange>
- RandomAccessRange& operator()(RandomAccessRange rng) {
- return boost::sort(rng);
- }
- };
-
- struct inplace_merge_fct {
- template<class BidirectionalRange>
- BidirectionalRange&
- operator()( BidirectionalRange rng) {
- return boost::inplace_merge(rng, boost::begin(rng)+(boost::size(rng)/2));
- }
- };
- template <typename AE, typename Range>
- void parallel_sort(AE& ae, Range& range, unsigned cutoff=10000) {
- boost::iterator_range<typename boost::range_iterator<Range>::type> rng(range);
- inplace_solve<sort_fct,inplace_merge_fct,pool_type,Range>( ae, rng, cutoff);
- }
-
-
-[endsect]
-
-[/==================================]
-[section From a single to a multi threaded application]
-[/==================================]
-
-
-
-[endsect]
-
-[/==================================]
[section Thread safe deferred traces]
[/==================================]
@@ -403,7 +317,7 @@
BankAccount* checkingAcct_;
BankAccount* savingsAcct_;
AccountManager(BankAccount& checking, BankAccount& savings)
- : checkingAcct_(&checking)
+ : checkingAcct_(&checking)
, savingsAcct_(&savings)
{}
void Checking2Savings(int amount) {
@@ -451,104 +365,113 @@
};
}
-Evidently every operation must be atomic.
+Evidently every operation must be atomic. We use the STM_ATOMIC and STM_END_ATOMIC macors to hide all the transaction complexity
class BankAccount {
int balance_;
public:
void Deposit(unsigned amount) {
- stm::this_tread::atomic _;
- stm::this_tread::make_transactional_ptr(this)->balance_ += amount;
- _.commit();
+ STM_ATOMIC(t) {
+ t.wr_ptr(this)->balance_ += amount;
+ } STM_END_ATOMIC
}
// ...
};
-How all this works? `stm::this_tread::atomic _;` declares the scope of the variable `_` as an atomic transaction.
-To access this in the current transaction we use `stm::make_transactional_ptr(this)` which return a smart pointer.
-If nothing is said the transaction will be aborted at `_` destruction.
-When everything is ok we need to do a `_.commit()`.
-
-If there is a large use of make_transactional_ptr we can write instead
+How all this works? Let me write what what is begind these macros. These macros use a trick to that ensure that when the statement between both macros succeed the transaction is committed. As the transaction can fail (exception transaction_aborted thrown) we need to reiterate the execution of the statement. So what a user needs to write is something like
- {
- stm::this_tread::atomic _;
- stm::this_tread::transactional_ptr<BankAccount> this_ptr(this);
- this_ptr->balance_ += amount;
- _.commit();
+ void Deposit(unsigned amount) {
+ for (stm::transaction t; !t.commited() && t.restart(); t.no_throw_commit()) {
+ try {
+ t.wr_ptr(this)->balance_ += amount;
+ } catch (stm::transaction_aborted&) {}
+ }
}
-or even shorter with the suggar syntax
+1. creation of a new transaction
+2.a if not commited restart the transaction and enter the body of the for (3)
+2.b if commited exit the for.
+3. execute the statement
+4 catch stm::transaction_aborted - if a stm::transaction_aborted is thrown the next commit will fail
+5. do a no_throw commit (2)
+
+Next follows the definition of the STM_ATOMIC and STM_END_ATOMIC macros.
+
+
+To access this in the current transaction we use `t.wr_ptr(this)` which return a smart pointer.
+
+If there is a large use of t.wr_ptr(this) it is better to use a variable
{
- stm::this_tread::atomic_transactional_ptr <BankAccount> this_ptr(this);
- this_ptr->balance_ += amount;
- // other uses of this
- // ...
- this_ptr.commit();
+ STM_ATOMIC(t) {
+ stm::tx_wr_ptr<BankAccount> this_ptr(this,t);
+ this_ptr->balance_ += amount;
+ } STM_END_ATOMIC
}
-The other `BankAccount` functions are coded as expected. Here is the code introducing a `using stm::this_tread;`
-which makes it much more readable.
+The other `BankAccount` functions are coded as expected. Here is the comple code:
class BankAccount {
int balance_;
- using stm::this_tread;
+ using stm:;
public:
void Deposit(unsigned amount) {
- atomic_ptr<BankAccount> this_ptr(this);
- this_ptr->balance_ += amount;
- this_ptr.commit();
+ STM_ATOMIC(t) {
+ t.wr_ptr(this)->balance_ += amount;
+ } STM_END_ATOMIC
}
void Withdraw(unsigned amount) {
- atomic_ptr<BankAccount> this_ptr(this);
- this_ptr->balance_ -= amount;
- this_ptr.commit();
+ STM_ATOMIC(t) {
+ t.wr_ptr(this)->balance_ -= amount;
+ }
}
int GetBalance() const {
- atomic_ptr<BankAccount> this_ptr(this);
- int res = this_ptr->balance_;
- this_ptr.commit();
- return res;
+ STM_ATOMIC(t) {
+ return make_tx_rd_ptr(this,t)->balance_;
+ } STM_END_ATOMIC
}
};
The transfer from accounts is done like:
void Transfer(BankAccount* inA, BankAccount* outA, int amount) {
- using stm::this_tread;
- atomic _;
- make_transactional_ptr(inA)->Withdraw(amount);
- make_transactional_ptr(outA)_>Deposit(amount);
- _.commit();
+ using stm;
+ STM_ATOMIC(t) {
+ t.wr_ptr(inA)->Withdraw(amount);
+ t.wr_ptr(outA)->Deposit(amount);
+ } STM_END_ATOMIC
}
-The core of all this stuff is `stm::this_tread::atomic` and `stm::transactional_ptr<>`.
-`stm::make_transactional_ptr()` and `stm::this_tread::atomic_ptr<>` are defined in terms of `stm::this_tread::atomic` and `stm::transactional_ptr<>`.
+The core of all this stuff is `stm::transaction`, `stm::tx_wr_ptr<>` and `stm::tx_rd_ptr<>`.
+
+The interface of the transaction class is quite simple:
+
+ class transaction {
+ public:
+ bool commit();
+ bool no_throw_commit() throw();
+ void abort();
+
+ template <typename T>
+ shared_ptr<transactional_object_cache<T> > rd_ptr(T* ptr);
+
+ template <typename T>
+ shared_ptr<transactional_object_cache<T> > wr_ptr(T* ptr);
+
+ template <typename T> void delete_memory(T* ptr);
+ template <typename T>
+ shared_ptr<transactional_object_cache<T> > insert_in_new_cache(T* ptr);
-Next follows the interface of the atomic class.
+ transaction_state const & state() const;
+ };
- namespace stm {
- namespace this_thread {
- class atomic {
- public:
- atomic();
- ~atomic();
- void rollback();
- };
- } // this_transaction
- } // stm
-
-The atomic constructor will construct a
-transaction on the current thread and push it to the stack of nested transactions.
-The atomic destructor will rollback the transaction if not commited and pop the stack of nested transactions.
-We will see later the transaction class.
-The transactional_ptr<> smart pointer interface follows:
+
+The smart pointer interfaces follows:
template <typename T>
- class transactional_ptr {
+ class tx_rd_ptr {
public:
typedef T element_type;
@@ -556,43 +479,45 @@
typedef T * pointer;
typedef T& reference;
- transactional_ptr(T* p, transaction* tr=0);
- transactional_ptr(T* p, this_thread::atomic& scope);
+ tx_rd_ptr(T* p, transaction& scope);
- transactional_ptr(T* p, writable&tag, transaction* tr=0));
- transactional_ptr(T* p, writable&tag, this_thread::atomic& scope);
+ const T* operator->() const;
+ const T& operator*() const;
+ const T * get() const;
+ };
- transactional_ptr(T* p, is_new&tag, transaction* tr=0));
- transactional_ptr(T* p, is_new&tag, this_thread::atomic& scope);
- const T* operator->() const;
- const T& operator*() const;
- const T * get() const;
+ template <typename T>
+ class tx_wr_ptr {
+ public:
- T* operator->();
- T& operator*();
- T * get();
+ typedef T element_type;
+ typedef T value_type;
+ typedef T * pointer;
+ typedef T& reference;
+
+ tx_wr_ptr(T* p, transaction& scope);
- void delete_ptr();
+ T* operator->() const;
+ T& operator*() const;
+ T * get() const;
+
+ void delete_ptr();
};
Let me start with the simple constructor:
- transactional_ptr(T* p);
+ tx_wr_ptr(T* p);
This creates a smart pointer pointing to a specific transaction memory of the current transaction.
It contains the classic functions of a smart pointer overloaded with `const` or non `const`.
- const T* operator->() const;
- const T& operator*() const;
- const T * get() const;
-
- T* operator->();
- T& operator*();
- T * get();
+ T* operator->() const;
+ T& operator*() const;
+ T * get() const;
-By default the `transactional_ptr` points to a read only cache. When we use one of the non const operators,
+`tx_wr_ptr` points to a writable cache. When we use one of the smart pointer operators,
the pointers points to a upgraded write cache specific to the transaction. In the example
this_ptr->balance_ += amount;
@@ -600,48 +525,45 @@
the use of `this_ptr->balance_` on the left hand side of the assignement operator requires a non const access,
so the upgrade to writable is done.
-When we know a priori that the pointer contents will be modified we can create it as follows:
-
- void Deposit(unsigned amount) {
- atomic _;
- transactional_ptr<BankAccount> this_ptr(this, writable);
- this_ptr->balance_ += amount;
- _.commit();
- }
-
Every `new`/`delete` operation on a transaction must be in some way signaled to the transaction service.
-The new created objects would be wrapped by a `transactional_ptr<>` initialized like that;
+The new created objects would be wrapped by a `tx_wr_ptr<>` initialized like that;
- transactional_ptr<BankAccount> this_ptr(new BackAccount(), is_new);
+ tx_wr_ptr<BankAccount> this_ptr(new BackAccount(), is_new);
-When we want to delete a pointer in a transaction we use `transactional_ptr::delete_ptr`
+When we want to delete a pointer in a transaction we use `tx_wr_ptr::delete_ptr`
- transactional_ptr<BankAccount> p_ptr(p, writable);
+ tx_wr_ptr<BankAccount> p_ptr(p, t);
// ...
p_ptr.delete_ptr();
+
+or the short-cut
+
+ t.delete_ptr(p);
Before finishing with the `transaction` class let me show you the
`transactional_object_cache<T>` and its base class `transactional_object_cache_base`.
class transaction {
public:
- bool commit();
- void rollback();
- void rollback_only();
+ bool commit();
+ bool no_throw_commit();
+ void abort();
- template <typename T>
- shared_ptr<transactional_object_cache<T> > read(T* ptr);
+ template <typename T>
+ shared_ptr<transactional_object_cache<T> > read(T* ptr);
template <typename T>
- T* write(T* in);
+ shared_ptr<transactional_object_cache<T> > write(T* ptr);
- template <typename T> void delete_memory(T* in);
- template <typename T>
- shared_ptr<transactional_object_cache<T> > insert_in_new_cache(T* ptr);
+ template <typename T> void delete_memory(T* ptr);
+ template <typename T>
+ shared_ptr<transactional_object_cache<T> > insert_in_new_cache(T* ptr);
- transaction_state const & state() const;
+ transaction_state const & state() const;
};
+
+
[endsect]
[endsect]
Modified: sandbox/interthreads/libs/interthreads/doc/changes.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/changes.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/changes.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -7,93 +7,18 @@
[section:changes Appendix A: History]
-[section [*Version 0.4.3, May 9, 2009] Adaptation to Boost 1.39
-[endsect]
-
-[section [*Version 0.4.2, Mars 9, 2009] Adaptation to the Boost.ThreadPoold Version 0.23]
+[section [*Version 0.1.3, Mars 29, 2009] Extraction of the Asynchonous Executor framework]
[*New Features:]
-* Adaptation to the Boost.ThreadPoold Version 0.21
+* Extraction of the Asynchonous Executor framework
[endsect]
-[section [*Version 0.4.1, Mars 1, 2009] Adaptation to the Boost.ThreadPoold Version 0.21 + Scoped forking + Parallel sort]
-
-[*New Features:]
-
-* Adaptation to the Boost.ThreadPoold Version 0.21
-
-* Scoped forking: In [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2802.html N2802: A plea to reconsider detach-on-destruction for thread objects]
-Hans-J. Boehm explain why is detaching on destruction so dangerous and gives two solutions: 1) replace the call to detach by a join, 2) replace by a terminate call. The library provides the following classes
-
-* a RAII scoped_join which will join the assocaited act on the destructor if not already joined,
-
- basic_threader ae;
- BOOST_AUTO(act,bith::fork(ae, simple_thread));
- scoped_join<BOOST_TYPEOF(act)> j(act);
-
-* a RAII scoped_terminate which will call to teminate on the destructor if not already joined,
-
- basic_threader ae;
- BOOST_AUTO(act,bith::fork(ae, simple_thread));
- scoped_terminate<BOOST_TYPEOF(act)> j(act);
-
-* a RAII scoped_fork_join which will fork on construction and join the assocaited act on the destructor if not already joined,
-
- basic_threader ae;
- scoped_fork_join<BOOST_TYPEOF(bith::fork(ae, simple_thread)) > act(ae, simple_thread);
-
-* a RAII scoped_fork_terminate which will fork on construction and call to teminate on the destructor if not already joined,
-
- basic_threader ae;
- scoped_fork_terminate<BOOST_TYPEOF(bith::fork(ae, simple_thread) > act(ae, simple_thread);
-
-In addition unique_joiner/shared_joiner have a on_destruction parameter allowing to parameterize this behavior.
-
-
-[/*Tests:
-
-Add tests for move only __ACT__ basic_threader, unique_threader and unique_launcher)
-Change the implementation of the queue on the async_ostream.
-]
-[*Examples:]
-
-* Parallel sort
-
-[/*Documentation:
-
-* Complete ae/act framework.
-]
-[/*Fixed Bugs:]
-
-*]
-
-[endsect]
-
-[section [*Version 0.4.0, February 8, 2009] Improvements + bug fixes]
-[*New Features:]
-
-* New free functions for all the __ACT__ operations, providing a higher degree of freedom.
-* Missing `have_all_values()`, `have_all_exception()` and `are_all_ready()` functions on __ACT__ fusion tuples.
-* `get_all`: getting all the values from a tuple of __ACT__ works now.
-* fork_after overloaded for a single dependency
-* wait_all overloaded for a single ACT.
-* wait_for_all evaluate one of its elements on the current thread
-* No need to use `wait_and_get()` on `thread_specific_shared_ptr<>` to synchronize with the decoration
-if the thread is created using a __AE__ decorator. In this case the synchro is done before returning the __ACT__.
-See the tutorial and the mono_thread_id example.
-
-[*Documentation:]
-
-* New Tickets and test appendices
+[section [*Version 0.1.2, February 8, 2009] Bug fixes]
[*Fixed Bugs:]
-[*v0.2#1: `ae::get_all` do not work yet.]
-`get_all()` do not work because fusion transform sequence function can not take non const sequences.
-I have emulated it using `set_all()` and a transformation for a tuple of __ACT__ to a tuple of result_type.
-
[*v0.3.1#1: keep alive mechanism crash when setting `set_on_dead_thread()` before enabling the mechanism.]
This was due to the fact that there were no default data for the backup.
@@ -106,54 +31,8 @@
[endsect]
-[section [*Version 0.3.1, January 25, 2009] bug fixes]
-
-[*Fixed Bugs:]
-[*v0.3#3: `scheduler::do_test_fork_after_wait` do not work yet.]
-To solve this issue it enough to define boost::move for tp::task
-
-[*v0.3#2: `scheduler::do_test_fork_after_get` do not work yet.]
-To solve this issue it enough to define boost::move for tp::task
-
-[*v0.3#1: `scheduler::do_test_wait_for_any` do not work yet.]
-Not reproductible
-
-[*v0.2#2: Some trouble with the use of `tp::pool` directly, use `scheduler` instead.]
-Four issues.
-
-* The parameter to fork on `tp:pool` was a `const F&` instead of a `F`.
-* Direct use of `fork_all` resolved for the other __AE__ by ADL, which could not be the case for the `tp::pool`.
-* `fork` specialization for `tp::pool` incorrect.
-* use of the default handle instead of `asynchronous_completion_token` traits class
-
-[endsect]
-
-[section [*Version 0.3.0, January 19, 2009] fork after dependant act completes]
-
-[*New Features:]
-
-* `fork_after`: request the __AE__ to execute a function asynchronously once each one of __ACT__ s in the dependency tuple parameter are ready.
-* Add act traits, as value type, is movable, has_future_if, has_thread_if
-
-[endsect]
-
-[section [*Version 0.2.0, January 14, 2009] Asynchronous execution and test on more toolsets]
-
-[*New Features:]
-
-* Asynchronous executors (AE) and asynchronous completion token (ACT) framework
- * `fork` and `fork_all` functions
- * `wait_for_all`, `wait_for_any` functions
- * `set_all`, `join_all`, ...
-* `unique/shared_threader` (AE) and `unique/shared_joiner` (ACT) classes
-* `basic_threader` (AE) class
-* `unique/shared_launcher` (AE) class
-* `scheduler` (AE) class (working with `tp::pool`(AE) and `tp::task<>` (ACT))
-* `thread_decorator` can now decorate a nullary function in addition to a callable function
-* `asynchronous_executor_decorator` mixin allows to decorate the functions launched by an asynchronous executor
-* Boost.Typeof registration for the __ACT__ classes
-* The AE/ACT framework comes with significant tests
+[section [*Version 0.1.1, January 14, 2009] Bug fixes and test on more toolsets]
[*Toolsets:]
@@ -182,40 +61,18 @@
[heading [*Open Bugs:]]
-[*v0.4.0#1: wait_for_any.]
[heading [*Fixed Bugs:]]
-[*v0.3.1#1: keep alive mechanism crash when setting set_on_dead_thread before enabling the mechanism.]
+[*v0.1.1#1: keep alive mechanism crash when setting set_on_dead_thread before enabling the mechanism.]
This was due to the fact that there were no default data for the backup.
-[*v0.3.1#2: keep alive mechanism do not detect dead threads.]
+[*v0.1.1#2: keep alive mechanism do not detect dead threads.]
We need to reste the counters only when the period is 0.
-[*v0.3.1#3: The set_on_dead_thread setting is not recovered by embeeding enablers/disablers.]
+[*v0.1.1#3: The set_on_dead_thread setting is not recovered by embeeding enablers/disablers.]
The problem is that the on_dead and th thread pointer were stored on the backup. It is enough to store them on the
-[*v0.2#1: ae::get_all do not work yet.]
-get_all do not work because fusion transform sequence function can not take non const sequences.
-I have emulated it using set_all and a transformation for a tuple of ACT to a tuple of result_type.
-
-[*v0.3#3: scheduler::do_test_fork_after_wait do not work yet.]
-To solve this issue it enough to define boost::move for tp::task
-
-[*v0.3#2: scheduler::do_test_fork_after_get do not work yet.]
-To solve this issue it enough to define boost::move for tp::task
-
-[*v0.3#1: scheduler::do_test_wait_for_any do not work yet.]
-Not reproductible
-
-[*v0.2#2: Some trouble with the use of tp::pool directly, use scheduler instead.]
-Four issues.
-
-* The parameter to fork on tp:pool was a const F& instead of a F.
-* Direct use of fork_all resolved for the other AE by ADL, which could not be the case fro the tp::pool.
-* fork specialization for tp::pool incorrent.
-* use of the default handle instead of asynchronous_completion_token traits class
-
[*v0.1#1: basic_keep_alive example do not link.]
[endsect]
Modified: sandbox/interthreads/libs/interthreads/doc/concepts.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/concepts.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/concepts.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -16,462 +16,5 @@
[/=============================================]
[endsect]
-[/=============================================]
-[section Asynchronous Completion Token Concepts]
-[/=============================================]
-
-[/==================]
-[section:ACT Concept `ACT` ]
-[/==================]
-
-[heading Description]
-An __ACT__ allows to wait for the completion of an asynchronous executed operation.
-An __ACT__ should be __Movable__ or __CopyConstructible__.
-The completion of the __ACT__ is undefined at this level. Different models could signal this completion when setting a value or an exception.
-
-[heading Notation]
-
-[variablelist
- [[`act`] [An __ACT__]]
- [[`f`] [A __Nullary__ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
-]
-
-[heading Expression requirements]
-A type models a __ACT__ if, the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`wait(act)`] [void] [Constant]]
- [[`b = wait_until(act, abs_time)`] [bool] [Constant]]
- [[`b = wait_for(act, rel_time)`] [bool] [Constant]]
-]
-
-[heading Meta Expressions]
-[table
- [[Expression] [Type] [Compile Time Complexity]]
- [[`act_traits<ACT>::move_dest_type`] [Any] [Constant]]
- [[`act_traits<ACT>::move_result`] [MPL boolean] [Constant]]
- [[`is_movable<ACT>::type`] [MPL boolean] [Constant]]
- [[`has_future_if<ACT>::type`] [MPL boolean] [Constant]]
- [[`has_thread_if<ACT>::type`] [MPL boolean] [Constant]]
-]
-
-
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`wait(act)`] [Blocks until the `act` completes]]
- [[`b = wait_until(act,abs_time)`] [Blocks until the `act` completes or `abs_time` is reached]]
- [[`b = wait_for(act,rel_time)`] [Blocks until the `act` completes or `rel_time` has been elapsed]]
-]
-
-
-[heading Expression `wait(act)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Effects:] [Blocks until the `act` completes.]]
-[[Sychronization:][The completion of `act` happens before wait() returns.]]
-[[Throws:] [the stored exception, if an exception was stored and not retrieved before.]]
-[[Postconditions:] [is_ready(act) == true.]]
-[[Thread safety:][unsafe]]
-]
-
-[heading Expression `b = wait_until(act,abs_time)`]
-[/==========================================================================================]
-
- bool wait_until(const system_time& abs_time);
- template<typename TimeDuration>
- bool wait_for(TimeDuration const& rel_time);
-
-
-[variablelist
-[[Effects:] [Blocks until the `act` completes or `abs_time` is not reached.]]
-[[Sychronization:][The completion of the `act` happens before wait() returns.]]
-[[Returns:] [true only if the function returns because `act` is ready.]]
-[[Throws:] [the stored exception, if an exception was stored and not retrieved before.]]
-[[Postconditions:] [is_ready() == true.]]
-[[Thread safety:][unsafe]]
-]
-
-[heading Expression `b = wait_for(act,rel_time)`]
-[/==========================================================================================]
-
-
-
-[variablelist
-[[Effects:] [blocks until the `act` completes or `rel_time` has elapsed.]]
-[[Sychronization:][The completion of the `act` happens before wait() returns.]]
-[[Returns:] [true only if the function returns because `act` is ready.]]
-[[Throws:] [the stored exception, if an exception was stored and not retrieved before.]]
-[[Postconditions:] [is_ready() == true.]]
-[[Thread safety:][unsafe]]
-]
-
-[heading Models]
-
-* __unique_future__
-* __shared_future__
-* __unique_joiner__
-* __shared_joiner__
-* __tp_task__
-* __thread__
-
-[endsect]
-
-[/=============================]
-[section:FutureBasedACT Concept `FutureBasedACT` ]
-[/=============================]
-The completion of the __FutureBasedACT__ is undefined at this level but occurs usualy after a set_calue or set_exception on the associated promise.
-
-
-[heading Description]
-
-An __FutureBasedACT__ is a __ACT__ that associates a value expected on the its completion.
-
-[heading Notation]
-
-[variablelist
- [[`act`] [An __ACT__]]
- [[`cact`] [An const __ACT__]]
- [[`f`] [A __Nullary__ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
- [[`v`] [`act_traits<typeof(act)>::move_dest_type`]]
-]
-
-[heading Expression requirements]
-
-A type models an __FutureBasedACT__ if, in adition to being an __ACT__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`v = get(act)`] [`act_traits<typeof(act)>::move_dest_type`] [Constant]]
- [[`b = is_ready(cact)`] [bool] [Constant]]
- [[`b = has_exception(cact)`] [bool] [Constant]]
- [[`b = has_value(cact)`] [bool] [Constant]]
-]
-
-[heading Expression Semantics]
-[table
- [[Expression] [Semantics]]
- [[`v = get(act)`] [Blocks until `act` contains a value and returns the stored value]]
- [[`b = is_ready(cact)`] [Is true only if `cact` holds a value or an exception ready for retrieval.]]
- [[`b = has_exception(cact)`] [Is true only if `cact` contains an exception.]]
- [[`b = has_value(cact)`] [Is true only if `cact` contains a value]]
-]
-
-[heading Expression `v=get(act)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Effects:] [Retrieves the value returned by the Nullary function.]]
-[[Sychronization:][The completion of the `act` happens before get() returns.]]
-[[Returns:] [Depending on the nature of the ACT returns a `act_traits<ACT>::move_dest_type`.]]
-[[Throws:] [the stored exception, if an exception was stored and not retrieved before.]]
-[[Postconditions:] [if `act_traits<ACT>::move_result` is `true` it is unspecified what happens when `get()` is called a second time on the same shared_joiner.]]
-[[Thread safety:][unsafe]]
-]
-
-[heading Expression `b = is_ready(cact)`]
-[/==========================================================================================]
-
-[variablelist
-[[Returns:] [true only if `cact` holds a value or an exception ready for retrieval.]]
-[[Remark:] [if `act_traits<ACT>::move_result` is true the return value could be unspecified after a call to `get(act)`.]]
-]
-
-[heading Expression `b = has_exception(cact)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Returns:] [true only if `is_ready(cact)` == true and `cact` contains an exception.]]
-]
-
-[heading Expression `b = has_value(cact)`]
-[/==========================================================================================]
-
-[variablelist
-[[Returns:] [true only if `is_ready(cact)` == true and `cact` contains a value.]]
-]
-
-[heading Models]
-
-* __unique_future__
-* __shared_future__
-* __unique_joiner__
-* __shared_joiner__
-* __tp_task__
-
-[endsect]
-
-[/=============================]
-[section:ThreadBasedACT Concept `ThreadBasedACT` ]
-[/=============================]
-
-The completion of the __ThreadBasedACT__ is undefined at this level but occurs usualy after a function finish.
-
-[heading Description]
-
-An __ThreadBasedACT__ is a __ACT__ that provides a thread like interface.
-
-[heading Notation]
-
-[variablelist
- [[`act`] [An __ACT__]]
- [[`cact`] [A const __ACT__]]
- [[`cact`] [An const __ACT__]]
- [[`f`] [A __Nullary__ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
- [[`id`] [An `act_traits<__ACT__>::id_type`]]
-]
-
-[heading Expression requirements]
-A type models an __FutureBasedACT__ if, in adition to being an __ACT__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`b = joinable(cact)`] [bool] [Constant]]
- [[`join(act)`] [void] [Constant]]
- [[`b = join_until(act, abs_time)`] [bool] [Constant]]
- [[`b = join_for(act, rel_time)`] [bool] [Constant]]
- [[`detach(act)`] [void] [Constant]]
- [[`interrupt(act)`] [void] [Constant]]
- [[`b = interruption_requested(cact)`] [bool] [Constant]]
- [[`id = get_id(cact)`] [`act_traits<__ACT__>::id_type`] [Constant]]
-]
-
-[heading Expression Semantics]
-[table
- [[Expression] [Semantics]]
- [[`b = joinable(cact)`] [true if `cact` refers to a 'thread of execution', false otherwise]]
- [[`join(act)`] [waits for the assoiated 'thread of execution' to complete]]
- [[`b = join_until(act, abs_time)`] [waits for the assoiated 'thread of execution' to complete or the time `wait_until` has been reach.]]
- [[`b = join_for(act, rel_time)`] [waits for the assoiated 'thread of execution' to complete or the specified duration `rel_time` has elapsed ]]
- [[`detach(act)`] [the associated 'thread of execution' becomes detached, and no longer has an associated one]]
- [[`interrupt(act)`] [request that the associated 'thread of execution' be interrupted the next time it enters
- one of the predefined interruption points with interruption enabled, or if it is currently blocked in a call to one of the
- predefined interruption points with interruption enabled]]
- [[`b = interruption_requested(cact)`] [true if interruption has been requested for the associated 'thread of execution', false otherwise. ]]
- [[`id = get_id(cact)`] [an instance of `act_traits<__ACT__>::id_type` that represents the associated 'thread of execution'.]]
-]
-
-[heading Expresion `b=joinable(act)`]
-[/==========================================================================================]
-
-[variablelist
-[[Returns:] [true if `act` refers to a 'thread of execution', false otherwise]]
-[[Throws:] [Nothing]]
-]
-
-
-[heading Expresion `join()`]
-[/==========================================================================================]
-
-[variablelist
-[[Preconditions:] [`get_id(act)!=boost::interthreads::get_current_id<ACT>()`]]
-[[Effects:] [If `act` refers to a thread of execution, waits for that 'thread of execution' to complete.]]
-[[Postconditions:] [If `act` refers to a 'thread of execution' on entry, that 'thread of execution' has completed.
-`act` no longer refers to any 'thread of execution'.]]
-[[Throws:] [__thread_interrupted__ if the current thread of execution is interrupted.]]
-[[Notes:] [`join()` is one of the predefined __interruption_points__.]]
-]
-
-[heading Expresion `b=join_until(act)|b=join_for(act)`]
-[/==========================================================================================]
-
- bool join_until(const system_time& wait_until);
-
- template<typename TimeDuration>
- bool join_for(TimeDuration const& rel_time);
-
-[variablelist
-[[Preconditions:] [`get_id(act)!=boost::interthreads::get_current_id<ACT>()`]]
-[[Effects:] [If `act` refers to a 'thread of execution', waits for that thread of execution to complete, the time `wait_until` has
-been reach or the specified duration `rel_time` has elapsed. If `act` doesn't refer to a 'thread of execution', returns immediately.]]
-[[Returns:] [`true` if `act` refers to a thread of execution on entry, and that thread of execution has completed before the call
-times out, `false` otherwise.]]
-[[Postconditions:] [If `act` refers to a thread of execution on entry, and `timed_join` returns `true`, that thread of execution
-has completed, and `act` no longer refers to any thread of execution. If this call to `timed_join` returns `false`, `*this` is
-unchanged.]]
-[[Throws:] [__thread_interrupted__ if the current thread of execution is interrupted.]]
-[[Notes:] [`join_until()` is one of the predefined __interruption_points__.]]
-]
-
-[heading Expresion `detach(act)`]
-[/==========================================================================================]
-
-[variablelist
-[[Effects:] [If `act` refers to a 'thread of execution', that 'thread of execution' becomes detached, and no longer has an associated thread object.]]
-[[Postconditions:] [`act` no longer refers to any 'thread of execution'.]]
-[[Throws:] [Nothing]]
-]
-
-[heading Expresion `get_id(cact)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Returns:] [If `act` refers to a 'thread of execution', an instance of `act_traits<__ACT__>::id_type` that represents that __ACT__.
-Otherwise returns a default-constructed `act_traits<__ACT__>::id_type`.]]
-[[Throws:] [Nothing]]
-]
-
-[heading Expresion `interrupt(act)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Effects:] [If `act` refers to a 'thread of execution', request that the 'thread of execution' will be interrupted the next time it enters one of
-the predefined __interruption_points__ with interruption enabled, or if it is currently __blocked__ in a call to one of the
-predefined __interruption_points__ with interruption enabled .]]
-[[Throws:] [Nothing]]
-]
-
-[heading Expresion `h = native_handle(act)`]
-[/==========================================================================================]
-
-
-[variablelist
-[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
-implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
-[[Throws:] [Nothing.]]
-]
-
-
-
-[heading Models]
-
-* __unique_joiner__
-* __shared_joiner__
-* __thread__
-* __tp_task__
-
-[endsect]
-
-[endsect]
-
-[/======================================]
-[section Asynchronous Executors Concepts]
-[/======================================]
-
-[/==========================================================================================]
-[section Concept `AsynchronousExecutor`]
-[/==========================================================================================]
-
-[heading Description]
-
-An __AsynchronousExecutor__ executes asynchronously a function and returns an __ACT__ when calling the fork function on it.
-
-[heading Notation]
-
-[variablelist
- [[`ae`] [An __AE__]]
- [[`f`] [A __Nullary__ function with type F]]
- [[`act`] [An __ACT__]]
-]
-
-[heading Expression requirements]
-A type models a __AE__ if, the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`__fork__(ae, f)`] [__ACT__] [Constant]]
- [[`get_future<AE>()(act)`] [__Future__] [Constant]]
- [[`asynchronous_completion_token<AE, T>::type`] [Model of __ACT__ satisfying `__act_value<ACT>::type` is `T`] [Constant]]
-]
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`act = __fork__(ae, f)`] [request `ae` to execute asynchronously the function `f`and returns an __ACT__ ]]
- [[`get_future<AE>()(act)`] [gets a reference to a __Future__]]
-]
-
-[heading Constraints]
-The following constraints applies:
-
-* `act_value<__ACT__>::type == boost::result_of<F()::type>`
-
-[heading Models]
-
-* __basic_threader__
-* __unique_threader__
-* __shared_threader__
-* __launcher__
-* __shared_launcher__
-* __scheduler__
-* __tp_pool__
-
-
-[endsect]
-
-
-[/==========================================================================================]
-[section Concept `IntrinsicAsynchronousExecutor`]
-[/==========================================================================================]
-
-[heading Description]
-
-The default fork implementation put some requirements in its __AE__ parameter. This concept is related to this.
-An __IAE__ is __AE__ that works well with the default implementation of __fork__.
-
-[heading Notation]
-
-[variablelist
- [[`ae`] [An __IAE__]]
- [[`f`] [A __Nullary__ function]]
-]
-
-[heading Expression requirements]
-A type models an __IAE__ if, in adition to being an __AE__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`ae.fork(f)`] [`handle<boost::result_of<F()>::type`] [Constant]]
-]
-
-[heading Meta Expressions]
-[table
- [[Expression] [Model Of] [Compile Time Complexity]]
- [[`handle<boost::result_of<F()>::type`] [__ACT__] [Constant ]]
-]
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`ae.fork(f)`] [executes asynchronously the function `f` and returns a __handle__ ]]
-]
-
-
-[heading Models]
-* __basic_threader__
-* __unique_threader__
-* __shared_threader__
-* __launcher__
-* __shared_launcher__
-* __scheduler__
-
-
-
-[endsect]
-
-[endsect]
[endsect]
Modified: sandbox/interthreads/libs/interthreads/doc/getting_started.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/getting_started.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/getting_started.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -55,14 +55,6 @@
Bye, Bye!
]
-[/
-
- int main() {
- bith::wait_for_all(basic_threader_decorator, my_thread);
- return 0;
- }
-
-]
[endsect]
@@ -193,52 +185,6 @@
[endsect]
-[/==========================]
-[section Multiple algorithms]
-[/==========================]
-
-This example shows how to launch several algorithms and wait only for the more efficient.
-
- #include <boost/interthreads/typeof/threader.hpp>
- #include <boost/interthreads/wait_for_any.hpp>
- #include <iostream>
-
- namespace bith = boost::interthreads;
-
- int my_thread1() {
- sleep(3);
- std::cout << "1 thread_id=" << boost::this_thread::get_id() << std::endl;
- }
-
- int my_thread2() {
- sleep(1);
- std::cout << "2 thread_id=" << boost::this_thread::get_id() << std::endl;
- }
-
- int my_thread3() {
- sleep(2);
- std::cout << "3 thread_id=" << boost::this_thread::get_id() << std::endl;
- }
-
- int main() {
- bith::shared_threader ae;
- BOOST_AUTO(res,bith::wait_for_any(ae, my_thread1, my_thread2, my_thread3));
- std::cout << "Algotithm " << result.first+1 << " finished the first. result=" << result.second << std::endl;
- return 0;
- }
-
-This results on the following output
-
-[pre
-3 thread_id=0x9c03f8
-2 thread_id=0x9c0850
-1 thread_id=0x9d0c40
-Algotithm 2 finished the first. result=0
-
-]
-
-
-[endsect]
[endsect]
Added: sandbox/interthreads/libs/interthreads/doc/html/index.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/index.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,106 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Toward Boost.InterThreads</title>
+<link rel="stylesheet" href="../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="index.html" title="Toward Boost.InterThreads">
+<link rel="next" href="toward_boost_interthreads/overview.html" title=" Overview">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="toward_boost_interthreads/overview.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a></div>
+<div class="article" lang="en">
+<div class="titlepage">
+<div>
+<div><h2 class="title">
+<a name="toward_boost_interthreads"></a>Toward Boost.InterThreads</h2></div>
+<div><div class="authorgroup"><div class="author"><h3 class="author">
+<span class="firstname">Vicente J.</span> <span class="surname">Botet Escriba</span>
+</h3></div></div></div>
+<div><p class="copyright">Copyright © 2008 -2009 Vicente J. Botet Escriba</p></div>
+<div><div class="legalnotice">
+<a name="id4803231"></a><p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="section"> Overview</span></dt>
+<dd><dl><dt><span class="section"> Motivation</span></dt></dl></dd>
+<dt><span class="section"> Users'Guide</span></dt>
+<dd><dl>
+<dt><span class="section"><a href="toward_boost_interthreads/users_guide/getting_started.html">
+ Getting Started</a></span></dt>
+<dt><span class="section"> Tutorial</span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/users_guide/bibliography.html">
+ References</a></span></dt>
+<dt><span class="section"> Glossary</span></dt>
+</dl></dd>
+<dt><span class="section"> Reference</span></dt>
+<dd><dl>
+<dt><span class="section">Concepts</span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/reference/thread_extensions_reference.html">Thread
+ Extensions Reference</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/reference/thread_array_reference.html">Thread
+ Array Reference</a></span></dt>
+</dl></dd>
+<dt><span class="section">Examples</span></dt>
+<dd><dl>
+<dt><span class="section"><a href="toward_boost_interthreads/examples/thread_safe_deferred_traces.html">Thread
+ safe deferred traces</a></span></dt>
+<dt><span class="section"> STM</span></dt>
+</dl></dd>
+<dt><span class="section">Appendices</span></dt>
+<dd><dl>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/changes.html"> Appendix
+ A: History</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/rationale.html"> Appendix
+ B: Rationale</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/implementation.html">
+ Appendix C: Implementation Notes</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/acknowledgements.html">
+ Appendix D: Acknowledgments</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/tests.html"> Appendix
+ E: Tests</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/tickets.html"> Appendix
+ F: Tickets</a></span></dt>
+<dt><span class="section"><a href="toward_boost_interthreads/appendices/todo.html"> Appendix
+ G: Future plans</a></span></dt>
+</dl></dd>
+</dl>
+</div>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../doc/html/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Toward Boost.InterThreads is not a part of the Boost libraries.
+ </p></td></tr>
+</table></div>
+<p>
+ [/
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"><p><small>Last revised: October 05, 2009 at 16:58:26 GMT</small></p></td>
+<td align="right"><div class="copyright-footer"></div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="toward_boost_interthreads/overview.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a></div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/standalone_HTML.manifest
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/standalone_HTML.manifest 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,23 @@
+index.html
+toward_boost_interthreads/overview.html
+toward_boost_interthreads/overview/motivation.html
+toward_boost_interthreads/users_guide.html
+toward_boost_interthreads/users_guide/getting_started.html
+toward_boost_interthreads/users_guide/tutorial.html
+toward_boost_interthreads/users_guide/bibliography.html
+toward_boost_interthreads/users_guide/glosary.html
+toward_boost_interthreads/reference.html
+toward_boost_interthreads/reference/concepts.html
+toward_boost_interthreads/reference/thread_extensions_reference.html
+toward_boost_interthreads/reference/thread_array_reference.html
+toward_boost_interthreads/examples.html
+toward_boost_interthreads/examples/thread_safe_deferred_traces.html
+toward_boost_interthreads/examples/stm.html
+toward_boost_interthreads/appendices.html
+toward_boost_interthreads/appendices/changes.html
+toward_boost_interthreads/appendices/rationale.html
+toward_boost_interthreads/appendices/implementation.html
+toward_boost_interthreads/appendices/acknowledgements.html
+toward_boost_interthreads/appendices/tests.html
+toward_boost_interthreads/appendices/tickets.html
+toward_boost_interthreads/appendices/todo.html
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,97 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Appendices</title>
+<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="prev" href="examples/stm.html" title=" STM">
+<link rel="next" href="appendices/changes.html" title=" Appendix
+ A: History">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="examples/stm.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="appendices/changes.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="toward_boost_interthreads.appendices"></a>Appendices
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="appendices/changes.html"> Appendix
+ A: History</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="appendices/changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_3__mars_29__2009__extraction_of_the_asynchonous_executor_framework"><span class="bold"><strong>Version 0.1.3, Mars 29, 2009</strong></span> Extraction of the Asynchonous
+ Executor framework</a></span></dt>
+<dt><span class="section">Version 0.1.2, February 8, 2009 Bug fixes</span></dt>
+<dt><span class="section"><a href="appendices/changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_1__january_14__2009__bug_fixes_and_test_on_more_toolsets"><span class="bold"><strong>Version 0.1.1, January 14, 2009</strong></span> Bug fixes and test
+ on more toolsets</a></span></dt>
+<dt><span class="section"><a href="appendices/changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_0__november_30__2008____announcement_of_interthreads_"><span class="bold"><strong>Version 0.1.0, November 30, 2008</strong></span> <span class="emphasis"><em>Announcement
+ of Interthreads</em></span></a></span></dt>
+<dt><span class="section">Bugs</span></dt>
+</dl></dd>
+<dt><span class="section"><a href="appendices/rationale.html"> Appendix
+ B: Rationale</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="appendices/rationale.html#toward_boost_interthreads.appendices.rationale.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="appendices/rationale.html#toward_boost_interthreads.appendices.rationale.thread_specific_storage">Thread
+ Specific Storage</a></span></dt>
+<dt><span class="section"><a href="appendices/rationale.html#toward_boost_interthreads.appendices.rationale.keep_alive">Keep
+ Alive</a></span></dt>
+<dt><span class="section"><a href="appendices/rationale.html#toward_boost_interthreads.appendices.rationale.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="appendices/implementation.html">
+ Appendix C: Implementation Notes</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="appendices/implementation.html#toward_boost_interthreads.appendices.implementation.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="appendices/implementation.html#toward_boost_interthreads.appendices.implementation.thread_specific_storage">Thread
+ Specific Storage</a></span></dt>
+<dt><span class="section"><a href="appendices/implementation.html#toward_boost_interthreads.appendices.implementation.keep_alive">Keep
+ Alive</a></span></dt>
+<dt><span class="section"><a href="appendices/implementation.html#toward_boost_interthreads.appendices.implementation.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="appendices/acknowledgements.html">
+ Appendix D: Acknowledgments</a></span></dt>
+<dt><span class="section"><a href="appendices/tests.html"> Appendix
+ E: Tests</a></span></dt>
+<dd><dl><dt><span class="section">thread_specific_shared_pointer</span></dt></dl></dd>
+<dt><span class="section"><a href="appendices/tickets.html"> Appendix
+ F: Tickets</a></span></dt>
+<dt><span class="section"><a href="appendices/todo.html"> Appendix
+ G: Future plans</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="appendices/todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review">Tasks
+ to do before review</a></span></dt>
+<dt><span class="section"><a href="appendices/todo.html#toward_boost_interthreads.appendices.todo.for_later_releases">For
+ later releases</a></span></dt>
+</dl></dd>
+</dl></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="examples/stm.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="appendices/changes.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/acknowledgements.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/acknowledgements.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,61 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+ Appendix D: Acknowledgments</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="implementation.html" title="
+ Appendix C: Implementation Notes">
+<link rel="next" href="tests.html" title=" Appendix
+ E: Tests">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="implementation.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tests.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.acknowledgements"></a><a href="acknowledgements.html" title="
+ Appendix D: Acknowledgments">
+ Appendix D: Acknowledgments</a>
+</h3></div></div></div>
+<p>
+ Part of this library (thread_decorator and thread_specific_shared_ptr) are
+ based on the original implementation of threadalert written by Roland Schwarz (thread::init
+ and thread_member_ptr). Many Thanks to Roland that allowed me to adapt his
+ implementation.
+ </p>
+<p>
+ Thanks also must go to Jochen Heckl for the ideas given respect to the thread_tuple::wait_first
+ implementation.
+ </p>
+<p>
+ You can help me to make this library better! Any feedback is very welcome.
+ </p>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="implementation.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tests.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/changes.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/changes.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,180 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Appendix
+ A: History</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="../appendices.html" title="Appendices">
+<link rel="next" href="rationale.html" title=" Appendix
+ B: 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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../appendices.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="rationale.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.changes"></a><a href="changes.html" title=" Appendix
+ A: History"> Appendix
+ A: History</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_3__mars_29__2009__extraction_of_the_asynchonous_executor_framework"><span class="bold"><strong>Version 0.1.3, Mars 29, 2009</strong></span> Extraction of the Asynchonous
+ Executor framework</a></span></dt>
+<dt><span class="section">Version 0.1.2, February 8, 2009 Bug fixes</span></dt>
+<dt><span class="section"><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_1__january_14__2009__bug_fixes_and_test_on_more_toolsets"><span class="bold"><strong>Version 0.1.1, January 14, 2009</strong></span> Bug fixes and test
+ on more toolsets</a></span></dt>
+<dt><span class="section"><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_0__november_30__2008____announcement_of_interthreads_"><span class="bold"><strong>Version 0.1.0, November 30, 2008</strong></span> <span class="emphasis"><em>Announcement
+ of Interthreads</em></span></a></span></dt>
+<dt><span class="section">Bugs</span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.changes.__version_0_1_3__mars_29__2009__extraction_of_the_asynchonous_executor_framework"></a><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_3__mars_29__2009__extraction_of_the_asynchonous_executor_framework" title="Version 0.1.3, Mars 29, 2009 Extraction of the Asynchonous
+ Executor framework"><span class="bold"><strong>Version 0.1.3, Mars 29, 2009</strong></span> Extraction of the Asynchonous
+ Executor framework</a>
+</h4></div></div></div>
+<p>
+ <span class="bold"><strong>New Features:</strong></span>
+ </p>
+<div class="itemizedlist"><ul type="disc"><li>
+ Extraction of the Asynchonous Executor framework
+ </li></ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.changes.__version_0_1_2__february_8__2009__bug_fixes"></a>Version 0.1.2, February 8, 2009 Bug fixes
+</h4></div></div></div>
+<p>
+ <span class="bold"><strong>Fixed Bugs:</strong></span>
+ </p>
+<p>
+ <span class="bold"><strong>v0.3.1#1: keep alive mechanism crash when setting
+ <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code>
+ before enabling the mechanism.</strong></span> This was due to the fact that
+ there were no default data for the backup.
+ </p>
+<p>
+ <span class="bold"><strong>v0.3.1#2: keep alive mechanism do not detect dead
+ threads.</strong></span> We need to reset the counters only when the period
+ is 0.
+ </p>
+<p>
+ <span class="bold"><strong>v0.3.1#3: The <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code> setting is not recovered by embeeding
+ kep_alive enablers/disablers.</strong></span> The problem is that the <code class="computeroutput"><span class="identifier">on_dead</span><span class="special">()</span></code>
+ the function and the thread pointer were stored on the backup. It is enough
+ to store them on the <code class="computeroutput"><span class="identifier">thread_keep_alive_ctx</span></code>
+ and make the functions thread_safe.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.changes.__version_0_1_1__january_14__2009__bug_fixes_and_test_on_more_toolsets"></a><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_1__january_14__2009__bug_fixes_and_test_on_more_toolsets" title="Version 0.1.1, January 14, 2009 Bug fixes and test
+ on more toolsets"><span class="bold"><strong>Version 0.1.1, January 14, 2009</strong></span> Bug fixes and test
+ on more toolsets</a>
+</h4></div></div></div>
+<p>
+ <span class="bold"><strong>Toolsets:</strong></span>
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ Tested on Linux gcc 3.4.6.
+ </li>
+<li>
+ Tested on Linux gcc 4.1.2.
+ </li>
+<li>
+ Modification helping Windows (not tested)
+ </li>
+</ul></div>
+<p>
+ <span class="bold"><strong>Fixed Bugs:</strong></span>
+ </p>
+<p>
+ <span class="bold"><strong>v0.1#1: basic_keep_alive example do not link.</strong></span>
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.changes.__version_0_1_0__november_30__2008____announcement_of_interthreads_"></a><a href="changes.html#toward_boost_interthreads.appendices.changes.__version_0_1_0__november_30__2008____announcement_of_interthreads_" title="Version 0.1.0, November 30, 2008 Announcement
+ of Interthreads"><span class="bold"><strong>Version 0.1.0, November 30, 2008</strong></span> <span class="emphasis"><em>Announcement
+ of Interthreads</em></span></a>
+</h4></div></div></div>
+<p>
+ <span class="bold"><strong>Features:</strong></span>
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+<code class="computeroutput"><span class="identifier">thread_decorator</span></code> setup/cleanup
+ thread decorator,
+ </li>
+<li>
+ thread specific shared pointer,
+ </li>
+<li>
+ thread keep alive mechanism,
+ </li>
+<li>
+ thread tuples, set_once synchonizer, thread_tuple_once and thread_group_once.
+ </li>
+</ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.changes.__bugs_"></a>Bugs
+</h4></div></div></div>
+<a name="toward_boost_interthreads.appendices.changes.__bugs_._emphasis_role__bold__open_bugs___emphasis_"></a><h5>
+<a name="id4854878"></a>
+ Open Bugs:
+ </h5>
+<a name="toward_boost_interthreads.appendices.changes.__bugs_._emphasis_role__bold__fixed_bugs___emphasis_"></a><h5>
+<a name="id4854907"></a>
+ Fixed Bugs:
+ </h5>
+<p>
+ <span class="bold"><strong>v0.1.1#1: keep alive mechanism crash when setting
+ set_on_dead_thread before enabling the mechanism.</strong></span> This was due
+ to the fact that there were no default data for the backup.
+ </p>
+<p>
+ <span class="bold"><strong>v0.1.1#2: keep alive mechanism do not detect dead
+ threads.</strong></span> We need to reste the counters only when the period
+ is 0.
+ </p>
+<p>
+ <span class="bold"><strong>v0.1.1#3: The set_on_dead_thread setting is not recovered
+ by embeeding enablers/disablers.</strong></span> The problem is that the on_dead
+ and th thread pointer were stored on the backup. It is enough to store
+ them on the
+ </p>
+<p>
+ <span class="bold"><strong>v0.1#1: basic_keep_alive example do not link.</strong></span>
+ </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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../appendices.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="rationale.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/implementation.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/implementation.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,196 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+ Appendix C: Implementation Notes</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="rationale.html" title=" Appendix
+ B: Rationale">
+<link rel="next" href="acknowledgements.html" title="
+ Appendix D: Acknowledgments">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="rationale.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.implementation"></a><a href="implementation.html" title="
+ Appendix C: Implementation Notes">
+ Appendix C: Implementation Notes</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_specific_storage">Thread
+ Specific Storage</a></span></dt>
+<dt><span class="section"><a href="implementation.html#toward_boost_interthreads.appendices.implementation.keep_alive">Keep
+ Alive</a></span></dt>
+<dt><span class="section"><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.implementation.thread_decorator"></a><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_decorator" title="Thread
+ Decorator">Thread
+ Decorator</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Thread safe</span></dt>
+<dd><p>
+ The library is thread safe as far as the thread decorations are declared
+ staticaly, because these variables will be initialized sequentially.
+ </p></dd>
+<dt><span class="term">Chained thread decorations</span></dt>
+<dd><p>
+ All the thread decorations are chained between them.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.implementation.thread_specific_storage"></a><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_specific_storage" title="Thread
+ Specific Storage">Thread
+ Specific Storage</a>
+</h4></div></div></div>
+<p>
+ The Thread-Specific Storage pattern can be implemented in various ways
+ </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">External versus internal thread storage</span></dt>
+<dd><p>
+ The thread specific data collections can be stored either externally
+ to all threads or internally to each thread. The thread_specific_shared_ptr
+ use both ensuring efficiency when the context is requested by the current
+ thread and allowing threads to access thread specific pointer of other
+ threads
+ </p></dd>
+<dt><span class="term">Fixed- vs. variable-sized thread specific
+ key mapping</span></dt>
+<dd><p>
+ This library is based on the the Boost.Thread thread_specific_ptr implementation
+ which use a variable-size map indexed by the address of the object.
+ Future releases will provide fixed and mixed keys.
+ </p></dd>
+<dt><span class="term">Fixed- vs. variable-sized mapping of
+ thread IDs to thread specific pointers</span></dt>
+<dd><p>
+ It may be impractical to have a fixed-size array with an entry for
+ every possible thread ID value. Instead, it is more space efficient
+ to have threads use a dynamic data structure to map thread IDs to thread
+ specific pointers.
+ </p></dd>
+<dt><span class="term">One mapping of thread IDs to thread
+ specific pointers or to thread specific key mapping</span></dt>
+<dd><p>
+ This library maps thread IDs to thread specific pointers to avoid contention
+ on a single map.
+ </p></dd>
+<dt><span class="term">Default versus explicit specific context
+ setting</span></dt>
+<dd><p>
+ This library provides explicit setting. In future release will provide
+ explicit/eager and implicit/lazy specific context setting. Note that
+ implicit setting will need a factory or a default constructible type.
+ </p></dd>
+<dt><span class="term">Ordered or unordered map</span></dt>
+<dd><p>
+ While the thread::id type is ordered, there is no need to use it. The
+ current implementation use an ordered map. Future version will allow
+ the user to configure this.
+ </p></dd>
+<dt><span class="term">Intrusive or not maps</span></dt>
+<dd><p>
+ As the thread specific pointer is stored on only one map the implementation
+ could use an intrusive container. This will be provided in future releases
+ </p></dd>
+<dt><span class="term">Shared versus exclusive locking</span></dt>
+<dd><p>
+ Locating the right TS pointer requires the use of mutex to prevent
+ race conditions. The library use a a shared_mutex because most of the
+ access to the map will be readings by other threads. The problem is
+ that the native conditions can not be used directly with shared mutex.
+ Some benchmarks will be needed before decidinf which implementation
+ is the best.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.implementation.keep_alive"></a><a href="implementation.html#toward_boost_interthreads.appendices.implementation.keep_alive" title="Keep
+ Alive">Keep
+ Alive</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Ensuring keep alive manager singleton
+ is initialized and the thread specific shared storage is set before use</span></dt>
+<dd><p>
+ The use of the thread decoration ensures that the decoration are called
+ before the user thread function is called. The keep_alive decoration
+ use the call_once to ensure that the keep_alive manager is correctly
+ initialized.
+ </p></dd>
+<dt><span class="term">backup/restore context</span></dt>
+<dd><p>
+ The real thread specific data is stored directly on the stack of enablers/disablers
+ avoiding heap memory. On enablers/disablers construction they store
+ a backup pointer to the nesting context. This allows a quick restore.
+ The keep alive pointer contains just a pointer to this data.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.implementation.thread_tuple"></a><a href="implementation.html#toward_boost_interthreads.appendices.implementation.thread_tuple" title="Thread
+ Tuple">Thread
+ Tuple</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Joining the first finishing thread</span></dt>
+<dd><p>
+ In order to synchronize the end of all the threads the libarry use
+ a internal class which stores the index of the first thread notifying
+ that it is finished. As the user function has no idea of this index
+ we need to wrap the user thread functions.
+ </p></dd>
+</dl>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="rationale.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/rationale.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/rationale.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,1136 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Appendix
+ B: Rationale</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="changes.html" title=" Appendix
+ A: History">
+<link rel="next" href="implementation.html" title="
+ Appendix C: Implementation Notes">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="changes.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="implementation.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.rationale"></a><a href="rationale.html" title=" Appendix
+ B: Rationale"> Appendix
+ B: Rationale</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_specific_storage">Thread
+ Specific Storage</a></span></dt>
+<dt><span class="section"><a href="rationale.html#toward_boost_interthreads.appendices.rationale.keep_alive">Keep
+ Alive</a></span></dt>
+<dt><span class="section"><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.rationale.thread_decorator"></a><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_decorator" title="Thread
+ Decorator">Thread
+ Decorator</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Function wrapper versus thread refinement</span></dt>
+<dd><p>
+ The threadalert on which this library was initialy based redefined
+ the boost:thread class which called implicitly the wrapper. As the
+ single varying features between both threads was this wrapping of the
+ thread function it has been isolated in the interthreads library.
+ </p></dd>
+<dt><span class="term">Static decoration variables</span></dt>
+<dd><p>
+ Thread decorations construction is not thread safe and must be done
+ before other threads have been created and the <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code> function is called.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.rationale.thread_specific_storage"></a><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_specific_storage" title="Thread
+ Specific Storage">Thread
+ Specific Storage</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Non copiable/Non movable</span></dt>
+<dd><p>
+ Specific pointers are singletons.
+ </p></dd>
+<dt><span class="term">External locking</span></dt>
+<dd><p>
+ In order to ensure thread safety while providing as much functionality
+ as possible the class allows to get the map of thread specific contexts
+ as soon as the application provides a <code class="computeroutput"><span class="identifier">unique_lock</span></code>.
+ </p></dd>
+<dt><span class="term">Mimic thread_specific_ptr</span></dt>
+<dd>
+<p>
+ From the point of view of the current thread thread_specific_shared_ptr
+ behaves as a thread_specific_ptr. From it we takes:
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="identifier">thread_specific_shared_ptr</span><span class="special">();</span>
+<span class="keyword">explicit</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_</span><span class="special">)(</span><span class="identifier">shared_ptr_type</span><span class="special">));</span>
+<span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</dd>
+<dt><span class="term">Mimic shared_ptr</span></dt>
+<dd>
+<p>
+ From the point of view of the other threads thread_specific_shared_ptr
+ behaves as a shared_ptr lockup. From the point of view of the current
+ thread the stored pointer is located in a shared_pointer, so we can
+ use the shared_ptr deleter feature From shared_ptr takes:
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">A</span> <span class="identifier">a</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</dd>
+<dt><span class="term">Why doesn't thread_specific_shared_ptr
+ provide a release() function?</span></dt>
+<dd><p>
+ As it store a shared_ptr, it cannot give away ownership unless it's
+ unique() because the other copy will still destroy the object.
+ </p></dd>
+</dl>
+</div>
+<a name="toward_boost_interthreads.appendices.rationale.thread_specific_storage.comparaing_tsss_and_tss"></a><h5>
+<a name="id4855813"></a>
+ <a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_specific_storage.comparaing_tsss_and_tss">Comparaing
+ TSSS and TSS</a>
+ </h5>
+<div class="table">
+<a name="id4855829"></a><p class="title"><b>Table 1. Comparaing TSSS and TSS</b></p>
+<table class="table" summary="Comparaing TSSS and TSS">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Feature
+ </p>
+ </th>
+<th>
+ <p>
+ thread_specific_shared_ptr
+ </p>
+ </th>
+<th>
+ <p>
+ thread_specific_ptr
+ </p>
+ </th>
+<th>
+ <p>
+ Compatible
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ ownership
+ </p>
+ </td>
+<td>
+ <p>
+ shared
+ </p>
+ </td>
+<td>
+ <p>
+ exclusive
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ default constructor
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ cleanup constructor
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>: can not delete the pointer
+ </p>
+ </td>
+<td>
+ <p>
+ yes:must delete the pointer
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">(</span><span class="identifier">T</span><span class="special">*)</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span><span class="special">*)</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span><span class="special">*,</span><span class="identifier">D</span><span class="special">)</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span><span class="special">*,</span><span class="identifier">D</span><span class="special">,</span><span class="identifier">A</span><span class="special">)</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">release</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">get_mutex</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">get_map</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">wait_and_get</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.rationale.keep_alive"></a><a href="rationale.html#toward_boost_interthreads.appendices.rationale.keep_alive" title="Keep
+ Alive">Keep
+ Alive</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Can a thread that has just do a check
+ point be considered as dead less than one second after?</span></dt>
+<dd><p>
+ Whell this depends on the enabling parameters. If the checking parameter
+ is greater than one it could be possible that the thread do a check_point
+ just before the keep alive manager do the check, seen that there are
+ not enough check_points and declaring the thread dead. If you want
+ to avoid this situation let the checkin to 1.
+ </p></dd>
+<dt><span class="term">Nesting enablers and disablers</span></dt>
+<dd><p>
+ Enablers/disablers use RAII, so they can be nested and the context
+ be restored on the destructor.
+ </p></dd>
+<dt><span class="term">Configurable on dead action</span></dt>
+<dd><p>
+ The default action is to abort the process because I don't see any
+ generic and cleaner way to manage this event. The library provides
+ this hook for user wanting to try something specific.
+ </p></dd>
+<dt><span class="term">Who control the controler?</span></dt>
+<dd><p>
+ There is no way to control this thread other than adding an external
+ process.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.rationale.thread_tuple"></a><a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_tuple" title="Thread
+ Tuple">Thread
+ Tuple</a>
+</h4></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Why must be not copiable?</span></dt>
+<dd><p>
+ Thread tuples can not be copiable since boost::thread is not copiable.
+ </p></dd>
+<dt><span class="term">Why should be movable?</span></dt>
+<dd><p>
+ If we want functions to return Thread tuples it is necessary to make
+ them movable.
+ </p></dd>
+<dt><span class="term">Mimic boost::thread_group</span></dt>
+<dd>
+<p>
+ thread_tuple has in common some function found in thread_group. From
+ it we take
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+<span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">();</span>
+</pre>
+<p>
+ </p>
+<p>
+ </p>
+</dd>
+<dt><span class="term">Mimic boost::thread</span></dt>
+<dd>
+<p>
+ We can consider a thread tuple as a compound thread, and so we can
+ mimic the thread intyerface. From it we takes
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span>
+<span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span>
+<span class="keyword">void</span> <span class="identifier">detach</span><span class="special">/</span><span class="identifier">detach_all</span><span class="special">();</span>
+<span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">timed_join</span><span class="special">/</span><span class="identifier">timed_join_all</span><span class="special">();</span>
+<span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">/</span><span class="identifier">all_joinable</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ </p>
+</dd>
+<dt><span class="term">Why the user can not modify directly
+ the embeeded threads?</span></dt>
+<dd>
+<p>
+ </p>
+<p>
+ The library provides a safe function to get a constant thread reference
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">i</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>
+<p>
+ </p>
+<p>
+ The problem if we provide the non constant variant is that the user
+ can detach them.
+ </p>
+<p>
+ </p>
+</dd>
+<dt><span class="term">Joining the first finishing thread
+ of a thread tuple</span></dt>
+<dd><p>
+ This functionallity has a price. We need to synchronize all the threads
+ transparently, so we need to wrap the user thread functions.
+ </p></dd>
+</dl>
+</div>
+<a name="toward_boost_interthreads.appendices.rationale.thread_tuple.comparaing_thread__thread_group_and_thread_tuple"></a><h5>
+<a name="id4857229"></a>
+ <a href="rationale.html#toward_boost_interthreads.appendices.rationale.thread_tuple.comparaing_thread__thread_group_and_thread_tuple">Comparaing
+ thread, thread_group and thread_tuple</a>
+ </h5>
+<div class="table">
+<a name="id4857246"></a><p class="title"><b>Table 2. Comparaing thread, thread_group and thread_tuple</b></p>
+<table class="table" summary="Comparaing thread, thread_group and thread_tuple">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Feature
+ </p>
+ </th>
+<th>
+ <p>
+ thread
+ </p>
+ </th>
+<th>
+ <p>
+ thread_group
+ </p>
+ </th>
+<th>
+ <p>
+ thread_tuple
+ </p>
+ </th>
+<th>
+ <p>
+ Compatible
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ default constructor
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ copiable
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ movable
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no*
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no*
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no*
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">interruption_requested</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no*
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">timed_join_all</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no* *
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">join_first_then_interrupt</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no* * *
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">timed_join_first_then_interrupt</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no* * *
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no
+ </p>
+ </td>
+<td>
+ <p>
+ <span class="bold"><strong>yes</strong></span>
+ </p>
+ </td>
+<td>
+ <p>
+ no*
+ </p>
+ </td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">*</span></dt>
+<dd><p>
+ thread_group could add these synonym functions
+ </p></dd>
+<dt><span class="term">* *</span></dt>
+<dd><p>
+ thread could add the size function returning 1
+ </p></dd>
+<dt><span class="term">* * *</span></dt>
+<dd><p>
+ thread & thread_group could add these functions
+ </p></dd>
+</dl>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="changes.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="implementation.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tests.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tests.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,58 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Appendix
+ E: Tests</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="acknowledgements.html" title="
+ Appendix D: Acknowledgments">
+<link rel="next" href="tickets.html" title=" Appendix
+ F: Tickets">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="acknowledgements.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tickets.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.tests"></a><a href="tests.html" title=" Appendix
+ E: Tests"> Appendix
+ E: Tests</a>
+</h3></div></div></div>
+<div class="toc"><dl><dt><span class="section">thread_specific_shared_pointer</span></dt></dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.tests.thread_specific_shared_pointer"></a>thread_specific_shared_pointer
+</h4></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup></colgroup>
+<tbody></tbody>
+</table></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="acknowledgements.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tickets.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tickets.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/tickets.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,286 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Appendix
+ F: Tickets</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="tests.html" title=" Appendix
+ E: Tests">
+<link rel="next" href="todo.html" title=" Appendix
+ G: Future plans">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tests.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="todo.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.tickets"></a><a href="tickets.html" title=" Appendix
+ F: Tickets"> Appendix
+ F: Tickets</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Kind
+ </p>
+ </th>
+<th>
+ <p>
+ Identifier
+ </p>
+ </th>
+<th>
+ <p>
+ Description
+ </p>
+ </th>
+<th>
+ <p>
+ Resolution
+ </p>
+ </th>
+<th>
+ <p>
+ State
+ </p>
+ </th>
+<th>
+ <p>
+ Tests
+ </p>
+ </th>
+<th>
+ <p>
+ Version
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ bug
+ </p>
+ </td>
+<td>
+ <p>
+ v0.1#1
+ </p>
+ </td>
+<td>
+ <p>
+ basic_keep_alive example do not link
+ </p>
+ </td>
+<td>
+ <p>
+ Add to the link
+ </p>
+ </td>
+<td>
+ <p>
+ Closed
+ </p>
+ </td>
+<td>
+ <p>
+ See basic_keep_alive.cpp example
+ </p>
+ </td>
+<td>
+ <p>
+ v0.2
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ bug
+ </p>
+ </td>
+<td>
+ <p>
+ v0.1.1#1
+ </p>
+ </td>
+<td>
+ <p>
+ keep alive mechanism crash when setting set_on_dead_thread before
+ enabling the mechanism
+ </p>
+ </td>
+<td>
+ <p>
+ This was due to the fact that there were no default data for the
+ backup.
+ </p>
+ </td>
+<td>
+ <p>
+ Closed
+ </p>
+ </td>
+<td>
+ <p>
+ See basic_keep_alive.cpp example
+ </p>
+ </td>
+<td>
+ <p>
+ v0.4
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ bug
+ </p>
+ </td>
+<td>
+ <p>
+ v0.1.1#2
+ </p>
+ </td>
+<td>
+ <p>
+ keep alive mechanism do not detect dead threads
+ </p>
+ </td>
+<td>
+ <p>
+ We need to reset the counters only when the period is 0.
+ </p>
+ </td>
+<td>
+ <p>
+ Closed
+ </p>
+ </td>
+<td>
+ <p>
+ See basic_keep_alive.cpp example
+ </p>
+ </td>
+<td>
+ <p>
+ v0.4
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ bug
+ </p>
+ </td>
+<td>
+ <p>
+ v0.1.1#3
+ </p>
+ </td>
+<td>
+ <p>
+ The set_on_dead_thread setting is not recovered by embeeding enablers/disablers
+ </p>
+ </td>
+<td>
+ <p>
+ The problem is that the on_dead and th thread pointer were stored
+ on the backup. It is enough to store them on the
+ </p>
+ </td>
+<td>
+ <p>
+ Closed
+ </p>
+ </td>
+<td>
+ <p>
+ See basic_keep_alive.cpp example
+ </p>
+ </td>
+<td>
+ <p>
+ v0.4
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ bug
+ </p>
+ </td>
+<td>
+ <p>
+ v0.2.0#1
+ </p>
+ </td>
+<td>
+ <p>
+ xxx
+ </p>
+ </td>
+<td>
+ <p>
+ xx
+ </p>
+ </td>
+<td>
+ <p>
+ Open
+ </p>
+ </td>
+<td>
+ <p>
+ xxx
+ </p>
+ </td>
+<td>
+ <p>
+ v0.4.1
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tests.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="todo.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/todo.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/appendices/todo.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,251 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Appendix
+ G: Future plans</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../appendices.html" title="Appendices">
+<link rel="prev" href="tickets.html" title=" Appendix
+ F: Tickets">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tickets.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.appendices.todo"></a><a href="todo.html" title=" Appendix
+ G: Future plans"> Appendix
+ G: Future plans</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review">Tasks
+ to do before review</a></span></dt>
+<dt><span class="section"><a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases">For
+ later releases</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.todo.tasks_to_do_before_review"></a><a href="todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review" title="Tasks
+ to do before review">Tasks
+ to do before review</a>
+</h4></div></div></div>
+<a name="toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.complete_the_tests"></a><h5>
+<a name="id4858992"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.complete_the_tests">Complete
+ the tests</a>
+ </h5>
+<p>
+ Even if the current release include some test there is yet a long way before
+ been able to review the library.]]
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ change the test so they take less time using locks; conditions and variables.
+ </li>
+<li>
+ Add test with functions throwing
+ </li>
+<li>
+ Formalize the tests for thread_decoratoor
+ </li>
+<li>
+ Formalize the tests for thread_specific_shared_ptr
+ </li>
+<li>
+ Add tests for keep alive mechanism
+ </li>
+</ul></div>
+<a name="toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.add_more_examples"></a><h5>
+<a name="id4859047"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.add_more_examples">Add
+ more examples</a>
+ </h5>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ Complete the STM example.
+ </li>
+<li>
+ Change the implementation of the file on the async_ostream.
+ </li>
+</ul></div>
+<a name="toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.change_the_rational_and_implementation_sections"></a><h5>
+<a name="id4859085"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.tasks_to_do_before_review.change_the_rational_and_implementation_sections">Change
+ the rational and implementation sections</a>
+ </h5>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases"></a><a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases" title="For
+ later releases">For
+ later releases</a>
+</h4></div></div></div>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.add_c__0x_move_semantics_on_compilers_supporting_it_and_use_the_boost_move_emulation_otherwise"></a><h5>
+<a name="id4859127"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.add_c__0x_move_semantics_on_compilers_supporting_it_and_use_the_boost_move_emulation_otherwise">Add
+ C++0x move semantics on compilers supporting it and use the Boost.Move
+ emulation otherwise</a>
+ </h5>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.use_c__0x_variadic_templates_on_compilers_supporting_it_and_use_the_preprocesor_otherwise"></a><h5>
+<a name="id4859157"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.use_c__0x_variadic_templates_on_compilers_supporting_it_and_use_the_preprocesor_otherwise">Use
+ C++0x variadic templates on compilers supporting it and use the preprocesor
+ otherwise</a>
+ </h5>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.use_c__0x_concepts_on_compilers_supporting_them_and_use_the_boost_conceptcheck_or_boost_concepttraits_otherwise"></a><h5>
+<a name="id4859188"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.use_c__0x_concepts_on_compilers_supporting_them_and_use_the_boost_conceptcheck_or_boost_concepttraits_otherwise">Use
+ C++0x Concepts on compilers supporting them and use the Boost.ConceptCheck
+ or Boost.ConceptTraits otherwise</a>
+ </h5>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.add_a_daemon_controlling_all_the_keep_alive_controller_threads"></a><h5>
+<a name="id4859219"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.add_a_daemon_controlling_all_the_keep_alive_controller_threads">Add
+ a daemon controlling all the keep alive controller threads</a>
+ </h5>
+<p>
+ This daemon will send regular keep_alive messages and kill the process
+ when dead.
+ </p>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.optimize_the_tsss_maps_using_intrusive_containers"></a><h5>
+<a name="id4859257"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.optimize_the_tsss_maps_using_intrusive_containers">Optimize
+ the TSSS maps using intrusive containers</a>
+ </h5>
+<a name="toward_boost_interthreads.appendices.todo.for_later_releases.generalize_both_specific_pointers_in_a_template_class_basic_thread_specific_ptr"></a><h5>
+<a name="id4859280"></a>
+ <a href="todo.html#toward_boost_interthreads.appendices.todo.for_later_releases.generalize_both_specific_pointers_in_a_template_class_basic_thread_specific_ptr">Generalize
+ both specific pointers in a template class basic_thread_specific_ptr</a>
+ </h5>
+<p>
+ <span class="bold"><strong>Domain Features</strong></span>
+ </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">ownership: exclusive/shared</span></dt>
+<dd><p>
+ Specifies if the pointer is exclusive to the thread or shared with
+ other threads.
+ </p></dd>
+<dt><span class="term">key range: fixed/variable/mixed </span></dt>
+<dd><p>
+ Specifies how the key range is defined. fixed has an integer range
+ 0..n, variable takes as key the address of the specific_ptr and mixed
+ use a variant of fixed or variable key.
+ </p></dd>
+<dt><span class="term">key creation: eager/lazy</span></dt>
+<dd><p>
+ Specifies how the key is created, eager at construction time, lazy
+ when needed.
+ </p></dd>
+<dt><span class="term">context setting: eager/lazy</span></dt>
+<dd><p>
+ Specifies how the pointer is set, eager at thread initialization time,
+ lazy when needed.
+ </p></dd>
+</dl>
+</div>
+<p>
+ The current <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code>
+ is exclusive, has a variable key range and so the key is initialized at
+ construction time and explicit context setting by user on the current thread.
+ </p>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">basic_thread_specific_ptr</span><span class="special"><</span><span class="identifier">exclusive</span><span class="special">,</span> <span class="identifier">variable_key_range</span><span class="special"><>,</span> <span class="identifier">eager_context_setting</span><span class="special">></span> <span class="identifier">thread_specific_ptr</span><span class="special">;</span>
+</pre>
+<p>
+ The current <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span></code>
+ is shared, has a variable key range and so the key is initialized at construction
+ time and explicit context setting by user on the current thread.
+ </p>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">basic_thread_specific_ptr</span><span class="special"><</span><span class="identifier">exclusive</span><span class="special">,</span> <span class="identifier">variable_key_range</span><span class="special"><>,</span> <span class="identifier">eager_context_setting</span><span class="special">></span> <span class="identifier">thread_specific_ptr</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Design rationale</strong></span>
+ </p>
+<p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> uses as key the address
+ of the variable. This has as consequence that the mapping from keys to
+ the thread specific context pointer is much less efficient that the direct
+ access provided by some implementations. In this concern this library would
+ try to improve the performance to this mapping providing direct access
+ keys. As the number of direct access keys must be know at compile time
+ this has a limit on the number of thread specific pointers. A mixed approach
+ would be also provided in which the key could be a fixed one or a variable
+ one. It is up to the user to give an hint of the key sort. When using fixed
+ or mixed keys, there is decision to take related to when the key is created,
+ i.e. eager before the threads starts or lazy when we need it.
+ </p>
+<p>
+ Non-portable: The interfaces of POSIX Pthreads, Solaris threads, and Win32
+ threads are very similar. However, the semantics of Win32 threads are subtly
+ different since they do not provide a reliable means of cleaning up objects
+ allocated in thread-specific storage when a thread exits. Moreover, there
+ is no API to delete a key in Solaris threads. This makes it hard to write
+ portable code among UNIX and Win32 platforms.
+ </p>
+<p>
+ So we need to implement it on top of the underlying OS. The idea is to
+ take a native thread specific pointer which will manage with the fixed,
+ variable and mixed keys. This exactly the approach of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code>
+ but only for variable keys.
+ </p>
+<p>
+ Just to finish, we need to decide when the context is set, two possibilities:
+ the user sets explicitlly the context when it considers pertinent or the
+ context is created lazily the first time we try to get it. The first approach
+ has the liability that the user needs to ensure that the context is set
+ before get them, but when the context must be set before the function thread
+ starts this is a no issue. The second is safe but has as consequence that
+ every access include a check. In addition the type must be default constructible.
+ </p>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">,</span> <span class="identifier">lazy_setting</span><span class="special">></span> <span class="identifier">ptr</span><span class="special">;</span>
+</pre>
+<p>
+ The pointer will be initilaized when needed as if we had do
+ </p>
+<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">ptr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span> <span class="keyword">new</span> <span class="identifier">myclass</span><span class="special">()</span> <span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Between the features:
+ </p>
+<p>
+ Thread_specific key mapping optimization: Replace the Boost.Thread thread_specific_ptr
+ thread specific key mapping implementation by a mix of fixed/variable mapping
+ which will provide efficient access to the fixed keys and scalability with
+ the others keys.
+ </p>
+<p>
+ Configuration the fixed/variable/mixed key range, ordered/unordered map,
+ intrusive/extrusive map, shared/exclusive locking.
+ </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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tickets.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../appendices.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,53 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Examples</title>
+<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="prev" href="reference/thread_array_reference.html" title="Thread
+ Array Reference">
+<link rel="next" href="examples/thread_safe_deferred_traces.html" title="Thread
+ safe deferred traces">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference/thread_array_reference.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="examples/thread_safe_deferred_traces.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="toward_boost_interthreads.examples"></a>Examples
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="examples/thread_safe_deferred_traces.html">Thread
+ safe deferred traces</a></span></dt>
+<dt><span class="section"> STM</span></dt>
+</dl></div>
+<p>
+ This section do includes complete examples using the library.
+ </p>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference/thread_array_reference.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="examples/thread_safe_deferred_traces.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/stm.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/stm.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,357 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> STM</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../examples.html" title="Examples">
+<link rel="prev" href="thread_safe_deferred_traces.html" title="Thread
+ safe deferred traces">
+<link rel="next" href="../appendices.html" title="Appendices">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="thread_safe_deferred_traces.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../appendices.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.examples.stm"></a> STM
+</h3></div></div></div>
+<p>
+ This section does not include a complete example using the library, but only
+ a case study that could use the library in some way. I'm curently working
+ on this.
+ </p>
+<p>
+ Transactional memory (TM) is a recent parallel programming concept which
+ reduces challenges found in parallel programming. TM offers numerous advantages
+ over other synchronization mechanisms.
+ </p>
+<p>
+ This case study contains some thoughts on how I see a "boostified"
+ version of DracoSTM, a software transactional memory (STM) system. DracoSTM
+ is a high performance lock-based C++ STM research library. DracoSTM uses
+ only native object-oriented language semantics, increasing its intuitiveness
+ for developers while maintaining high programmability via automatic handling
+ of composition, locks and transaction termination.
+ </p>
+<p>
+ The example will show only the part concerning how the different contexts
+ are stored.
+ </p>
+<p>
+ Let me start of with a typical use of this library with the Hello World!
+ of transactional concurrent programming, Bank accounts and transfers. Let
+ BankAccount be a simple account.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">);</span>
+ <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">};</span>
+<span class="keyword">void</span> <span class="identifier">Transfer</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">inA</span><span class="special">,</span> <span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">outA</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span>
+<span class="keyword">class</span> <span class="identifier">AccountManager</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
+ <span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
+ <span class="identifier">AccountManager</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">checking</span><span class="special">,</span> <span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">savings</span><span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">checkingAcct_</span><span class="special">(&</span><span class="identifier">checking</span><span class="special">)</span>
+ <span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">(&</span><span class="identifier">savings</span><span class="special">)</span>
+ <span class="special">{}</span>
+ <span class="keyword">void</span> <span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">Transfer</span><span class="special">(</span><span class="identifier">checkingAcct_</span><span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">,</span> <span class="identifier">amount</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ And here a little programm that emulates an employer and two employees behaviors.
+ The employees have requested the employer to transfer their salaries to their
+ checking accounts every month. The employer does the transfer on the 28th
+ of each month. The employees perform withdrawals and queries from their accounts
+ using an ATM. Some people have requested the Bank for automatic periodic
+ transfers from their checking accounts to their saving accounts. The transfer
+ is done on the 3rd of each month.
+ </p>
+<pre class="programlisting"><span class="identifier">BankAccount</span> <span class="special">*</span><span class="identifier">emp</span><span class="special">;</span>
+<span class="identifier">BankAccount</span> <span class="special">*</span><span class="identifier">c1</span><span class="special">;</span>
+<span class="identifier">BankAccount</span> <span class="special">*</span><span class="identifier">c2</span><span class="special">;</span>
+<span class="identifier">BankAccount</span> <span class="special">*</span><span class="identifier">s1</span><span class="special">;</span>
+<span class="identifier">AccountManager</span> <span class="special">*</span><span class="identifier">am1</span><span class="special">;</span>
+
+<span class="keyword">int</span> <span class="identifier">employer_th</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">day</span><span class="special">(</span><span class="number">28</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="number">2</span><span class="special">;++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">Transfer</span><span class="special">(</span><span class="identifier">emp</span><span class="special">,</span> <span class="identifier">c1</span><span class="special">,</span> <span class="number">3000</span><span class="special">);</span>
+ <span class="identifier">Transfer</span><span class="special">(</span><span class="identifier">emp</span><span class="special">,</span> <span class="identifier">c2</span><span class="special">,</span> <span class="number">3200</span><span class="special">);</span>
+ <span class="identifier">sleep</span><span class="special">(</span><span class="identifier">month</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">people_1_th</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">day</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+ <span class="identifier">c1</span><span class="special">-></span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">day</span><span class="special">(</span><span class="number">5</span><span class="special">));</span>
+ <span class="identifier">c1</span><span class="special">-></span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">500</span><span class="special">);</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">day</span><span class="special">(</span><span class="number">4</span><span class="special">));</span>
+ <span class="identifier">c1</span><span class="special">-></span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">200</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">automatic_transfer_th</span><span class="special">(</span><span class="identifier">AccountManager</span> <span class="special">*</span><span class="identifier">am</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">debit</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">day</span><span class="special">(</span><span class="number">3</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="number">2</span><span class="special">;++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">am</span><span class="special">.</span><span class="identifier">Checking2Savings</span><span class="special">(</span><span class="identifier">debit</span><span class="special">);</span>
+ <span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">month</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+ <span class="special">};</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Evidently every operation must be atomic. We use the STM_ATOMIC and STM_END_ATOMIC
+ macors to hide all the transaction complexity
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">)-></span><span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
+ <span class="special">}</span> <span class="identifier">STM_END_ATOMIC</span>
+ <span class="special">}</span>
+ <span class="comment">// ...
+</span>
+<span class="special">};</span>
+</pre>
+<p>
+ How all this works? Let me write what what is begind these macros. These
+ macros use a trick to that ensure that when the statement between both macros
+ succeed the transaction is committed. As the transaction can fail (exception
+ transaction_aborted thrown) we need to reiterate the execution of the statement.
+ So what a user needs to write is something like
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span> <span class="special">(</span><span class="identifier">stm</span><span class="special">::</span><span class="identifier">transaction</span> <span class="identifier">t</span><span class="special">;</span> <span class="special">!</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">commited</span><span class="special">()</span> <span class="special">&&</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">restart</span><span class="special">();</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">no_throw_commit</span><span class="special">())</span> <span class="special">{</span>
+ <span class="keyword">try</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">)-></span><span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">stm</span><span class="special">::</span><span class="identifier">transaction_aborted</span><span class="special">&)</span> <span class="special">{}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ 1. creation of a new transaction 2.a if not commited restart the transaction
+ and enter the body of the for (3) 2.b if commited exit the for. 3. execute
+ the statement 4 catch stm::transaction_aborted - if a stm::transaction_aborted
+ is thrown the next commit will fail 5. do a no_throw commit (2)
+ </p>
+<p>
+ Next follows the definition of the STM_ATOMIC and STM_END_ATOMIC macros.
+ </p>
+<p>
+ To access this in the current transaction we use <code class="computeroutput"><span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span></code>
+ which return a smart pointer.
+ </p>
+<p>
+ If there is a large use of t.wr_ptr(this) it is better to use a variable
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">stm</span><span class="special">::</span><span class="identifier">tx_wr_ptr</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">this_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">,</span><span class="identifier">t</span><span class="special">);</span>
+ <span class="identifier">this_ptr</span><span class="special">-></span><span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
+ <span class="special">}</span> <span class="identifier">STM_END_ATOMIC</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The other <code class="computeroutput"><span class="identifier">BankAccount</span></code> functions
+ are coded as expected. Here is the comple code:
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
+ <span class="keyword">using</span> <span class="identifier">stm</span><span class="special">:;</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">)-></span><span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
+ <span class="special">}</span> <span class="identifier">STM_END_ATOMIC</span>
+ <span class="special">}</span>
+ <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">)-></span><span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">make_tx_rd_ptr</span><span class="special">(</span><span class="keyword">this</span><span class="special">,</span><span class="identifier">t</span><span class="special">)-></span><span class="identifier">balance_</span><span class="special">;</span>
+ <span class="special">}</span> <span class="identifier">STM_END_ATOMIC</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ The transfer from accounts is done like:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">Transfer</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">inA</span><span class="special">,</span> <span class="identifier">BankAccount</span><span class="special">*</span> <span class="identifier">outA</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">using</span> <span class="identifier">stm</span><span class="special">;</span>
+ <span class="identifier">STM_ATOMIC</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="identifier">inA</span><span class="special">)-></span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">wr_ptr</span><span class="special">(</span><span class="identifier">outA</span><span class="special">)-></span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
+ <span class="special">}</span> <span class="identifier">STM_END_ATOMIC</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The core of all this stuff is <code class="computeroutput"><span class="identifier">stm</span><span class="special">::</span><span class="identifier">transaction</span></code>,
+ <code class="computeroutput"><span class="identifier">stm</span><span class="special">::</span><span class="identifier">tx_wr_ptr</span><span class="special"><></span></code>
+ and <code class="computeroutput"><span class="identifier">stm</span><span class="special">::</span><span class="identifier">tx_rd_ptr</span><span class="special"><></span></code>.
+ </p>
+<p>
+ The interface of the transaction class is quite simple:
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">transaction</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">bool</span> <span class="identifier">commit</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">no_throw_commit</span><span class="special">()</span> <span class="keyword">throw</span><span class="special">();</span>
+ <span class="keyword">void</span> <span class="identifier">abort</span><span class="special">();</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">rd_ptr</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">wr_ptr</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">delete_memory</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">insert_in_new_cache</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="identifier">transaction_state</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">state</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ The smart pointer interfaces follows:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">tx_rd_ptr</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">element_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">reference</span><span class="special">;</span>
+
+ <span class="identifier">tx_rd_ptr</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">transaction</span><span class="special">&</span> <span class="identifier">scope</span><span class="special">);</span>
+
+ <span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">const</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">};</span>
+
+
+<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">tx_wr_ptr</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">element_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">reference</span><span class="special">;</span>
+
+ <span class="identifier">tx_wr_ptr</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">transaction</span><span class="special">&</span> <span class="identifier">scope</span><span class="special">);</span>
+
+ <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+
+ <span class="keyword">void</span> <span class="identifier">delete_ptr</span><span class="special">();</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Let me start with the simple constructor:
+ </p>
+<pre class="programlisting"><span class="identifier">tx_wr_ptr</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
+</pre>
+<p>
+ This creates a smart pointer pointing to a specific transaction memory of
+ the current transaction.
+ </p>
+<p>
+ It contains the classic functions of a smart pointer overloaded with <code class="computeroutput"><span class="keyword">const</span></code> or non <code class="computeroutput"><span class="keyword">const</span></code>.
+ </p>
+<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="identifier">T</span> <span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<p>
+ <code class="computeroutput"><span class="identifier">tx_wr_ptr</span></code> points to a writable
+ cache. When we use one of the smart pointer operators, the pointers points
+ to a upgraded write cache specific to the transaction. In the example
+ </p>
+<pre class="programlisting"><span class="identifier">this_ptr</span><span class="special">-></span><span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
+</pre>
+<p>
+ the use of <code class="computeroutput"><span class="identifier">this_ptr</span><span class="special">-></span><span class="identifier">balance_</span></code> on the left hand side of the assignement
+ operator requires a non const access, so the upgrade to writable is done.
+ </p>
+<p>
+ Every <code class="computeroutput"><span class="keyword">new</span></code>/<code class="computeroutput"><span class="keyword">delete</span></code>
+ operation on a transaction must be in some way signaled to the transaction
+ service. The new created objects would be wrapped by a <code class="computeroutput"><span class="identifier">tx_wr_ptr</span><span class="special"><></span></code> initialized like that;
+ </p>
+<pre class="programlisting"><span class="identifier">tx_wr_ptr</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">this_ptr</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">BackAccount</span><span class="special">(),</span> <span class="identifier">is_new</span><span class="special">);</span>
+</pre>
+<p>
+ When we want to delete a pointer in a transaction we use <code class="computeroutput"><span class="identifier">tx_wr_ptr</span><span class="special">::</span><span class="identifier">delete_ptr</span></code>
+ </p>
+<pre class="programlisting"><span class="identifier">tx_wr_ptr</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">p_ptr</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">t</span><span class="special">);</span>
+<span class="comment">// ...
+</span><span class="identifier">p_ptr</span><span class="special">.</span><span class="identifier">delete_ptr</span><span class="special">();</span>
+</pre>
+<p>
+ or the short-cut
+ </p>
+<pre class="programlisting"><span class="identifier">t</span><span class="special">.</span><span class="identifier">delete_ptr</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span>
+</pre>
+<p>
+ Before finishing with the <code class="computeroutput"><span class="identifier">transaction</span></code>
+ class let me show you the <code class="computeroutput"><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
+ and its base class <code class="computeroutput"><span class="identifier">transactional_object_cache_base</span></code>.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">transaction</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">bool</span> <span class="identifier">commit</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">no_throw_commit</span><span class="special">();</span>
+ <span class="keyword">void</span> <span class="identifier">abort</span><span class="special">();</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">delete_memory</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">transactional_object_cache</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">insert_in_new_cache</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">ptr</span><span class="special">);</span>
+
+ <span class="identifier">transaction_state</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">state</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">};</span>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="thread_safe_deferred_traces.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../appendices.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/thread_safe_deferred_traces.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/examples/thread_safe_deferred_traces.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,337 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Thread
+ safe deferred traces</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../examples.html" title="Examples">
+<link rel="prev" href="../examples.html" title="Examples">
+<link rel="next" href="stm.html" title=" STM">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../examples.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="stm.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.examples.thread_safe_deferred_traces"></a><a href="thread_safe_deferred_traces.html" title="Thread
+ safe deferred traces">Thread
+ safe deferred traces</a>
+</h3></div></div></div>
+<p>
+ When executing on a multi thread environment, the output lines on std::cout
+ could interleave. We can synchronize these outputs with a global mutex
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">global_cout_mutex</span><span class="special">);</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="special">...</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ This mutex could be the bottleneck of the system. Only one mutex resource
+ for all the user threads.
+ </p>
+<pre class="programlisting">U U
+ /
+ /
+ U ----- R ----- U
+ |
+ |
+ U
+</pre>
+<p>
+ Another approach could be using a queue of output stream buffers for each
+ thread. Each buffer is timestamped with the creation date and there is a
+ concentrator that takes one by one the elements ordered by their timestamp.
+ Only the current thread can push on this queue because it is specific to
+ the thread. There is a single thread, the concentrator, that pops from these
+ queue. In this context we can ensure thread safety without locking as far
+ as the queue has at least two messages.
+ </p>
+<pre class="programlisting">U ----- R ------+
+ \
+ U ----- R ------\
+ \
+ U ----- R -------- C
+ / /
+ U ----- R ------/ /
+ /
+ U ----- R ------+
+</pre>
+<p>
+ This can be encapsulated in an async_ostream class
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">async_ostream</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">iostreams</span><span class="special">::</span><span class="identifier">stream</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">async_ostream_sink</span><span class="special">></span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">typedef</span> <span class="keyword">char</span> <span class="identifier">char_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">iostreams</span><span class="special">::</span><span class="identifier">sink_tag</span> <span class="identifier">category</span><span class="special">;</span>
+
+ <span class="identifier">async_ostream</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">flush</span><span class="special">();</span>
+<span class="special">};</span>
+
+<span class="keyword">extern</span> <span class="identifier">async_ostream</span> <span class="identifier">cout_</span><span class="special">;</span>
+</pre>
+<p>
+ With this interface the user can use cout_ as it used std::cout.
+ </p>
+<pre class="programlisting"><span class="identifier">cout_</span> <span class="special"><<</span> <span class="string">"Hello World!"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special">;</span>
+</pre>
+<p>
+ All the magic is in the <code class="computeroutput"><span class="keyword">template</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">iostreams</span><span class="special">::</span><span class="identifier">stream</span><span class="special"><></span></code>. The parameter must be a model of
+ a sink (See Boost.Iostreams). Here it is.
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">detail</span> <span class="special">{</span>
+ <span class="keyword">struct</span> <span class="identifier">async_ostream_sink</span> <span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="keyword">char</span> <span class="identifier">char_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">iostreams</span><span class="special">::</span><span class="identifier">sink_tag</span> <span class="identifier">category</span><span class="special">;</span>
+ <span class="identifier">async_ostream_sink</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">);</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">flush</span><span class="special">();</span>
+ <span class="keyword">private</span><span class="special">:</span>
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">async_ostream_concentrator</span><span class="special">;</span>
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">async_ostream</span><span class="special">;</span>
+ <span class="keyword">struct</span> <span class="identifier">impl</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">impl</span><span class="special">></span> <span class="identifier">impl_</span><span class="special">;</span>
+ <span class="special">};</span>
+<span class="special">}</span>
+</pre>
+<p>
+ This class declares the just minimum in order to model a sink. In addition,
+ in order to mask the implementation, the Pimpl idiom is used. The implementation
+ of these functions is straigtforward:
+ </p>
+<pre class="programlisting"><span class="identifier">async_ostream</span><span class="special">::</span><span class="identifier">async_ostream</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">base_type</span><span class="special">(</span><span class="identifier">os</span><span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">void</span> <span class="identifier">async_ostream</span><span class="special">::</span><span class="identifier">flush</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">this</span><span class="special">-></span><span class="identifier">base_type</span><span class="special">::</span><span class="identifier">flush</span><span class="special">();</span>
+ <span class="identifier">async_ostream</span><span class="special">&</span> <span class="identifier">d</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="identifier">d</span><span class="special">-></span><span class="identifier">flush</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">async_ostream_sink</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">impl_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">impl</span><span class="special">(</span><span class="identifier">os</span><span class="special">))</span> <span class="special">{}</span>
+
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">impl_</span><span class="special">-></span><span class="identifier">write</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span><span class="identifier">n</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">flush</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">impl_</span><span class="special">-></span><span class="identifier">flush</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Let me continue with the handle of the Pimpl pattern:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">impl</span> <span class="special">{</span>
+ <span class="identifier">impl</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">);</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os_</span><span class="special">;</span>
+ <span class="identifier">tsss_type</span> <span class="identifier">tsss_</span><span class="special">;</span>
+ <span class="identifier">priority_queue_type</span> <span class="identifier">queue_</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread_</span><span class="special">;</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">);</span>
+
+ <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">terminate</span><span class="special">(</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">async_ostream_thread_ctx</span><span class="special">></span> <span class="identifier">that</span><span class="special">);</span>
+ <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">(</span><span class="identifier">impl</span><span class="special">*</span> <span class="identifier">that</span><span class="special">);</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Of course we need to store a reference to the final ostream.
+ </p>
+<p>
+ The <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span>
+ <span class="identifier">tsss_</span></code> is used to encapsulate the
+ logic specific to each thread.
+ </p>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">async_ostream_thread_ctx</span><span class="special">></span> <span class="identifier">tsss_type</span><span class="special">;</span>
+</pre>
+<p>
+ A priority queue <code class="computeroutput"><span class="identifier">queue_</span></code> will
+ be used by the concentrator thread to order the stringstreams by date.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">timestamped</span> <span class="special">{</span>
+ <span class="identifier">system_time</span> <span class="identifier">date_</span><span class="special">;</span>
+ <span class="keyword">unsigned</span> <span class="identifier">seq_</span><span class="special">;</span>
+ <span class="identifier">T</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">reset_date</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">seq</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">date_</span> <span class="special">=</span> <span class="identifier">system_time</span><span class="special">();</span>
+ <span class="identifier">seq_</span> <span class="special">=</span> <span class="identifier">seq</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">struct</span> <span class="identifier">ptr_comparator_gt</span> <span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">timestamped</span><span class="special">*</span> <span class="identifier">value_type</span><span class="special">;</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span><span class="identifier">lhs</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="special">(</span><span class="identifier">lhs</span><span class="special">-></span><span class="identifier">date_</span> <span class="special">></span> <span class="identifier">rhs</span><span class="special">-></span><span class="identifier">date_</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span>
+ <span class="special">(</span><span class="identifier">lhs</span><span class="special">-></span><span class="identifier">date_</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">-></span><span class="identifier">date_</span><span class="special">)</span> <span class="special">&&</span> <span class="special">(</span><span class="identifier">lhs</span><span class="special">-></span><span class="identifier">seq_</span> <span class="special">></span> <span class="identifier">rhs</span><span class="special">-></span><span class="identifier">seq_</span><span class="special">)?</span> <span class="keyword">true</span><span class="special">:</span><span class="keyword">false</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">};</span>
+<span class="special">};</span>
+
+<span class="keyword">typedef</span> <span class="identifier">timestamped</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span><span class="special">></span> <span class="identifier">element_type</span><span class="special">;</span>
+<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">priority_queue</span><span class="special"><</span><span class="identifier">queue_type</span><span class="special">*,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">deque</span><span class="special"><</span><span class="identifier">element_type</span><span class="special">*>,</span> <span class="identifier">element_type</span><span class="special">::</span><span class="identifier">ptr_comparator_gt</span><span class="special">></span> <span class="identifier">priority_queue_type</span><span class="special">;</span>
+</pre>
+<p>
+ In addition to the timestamp <code class="computeroutput"><span class="identifier">date_</span></code>
+ we need a sequence number to order the stringstreams pushed without enough
+ time granularity, e.g. on the same microsecond.
+ </p>
+<p>
+ To finish the field declaration there is the concentrator thread implemented
+ by the loop function.
+ </p>
+<pre class="programlisting"><span class="special">,</span> <span class="identifier">thread_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">loop</span><span class="special">,</span> <span class="keyword">this</span><span class="special">))</span>
+</pre>
+<p>
+ Comming back to the sink implementation,
+ </p>
+<pre class="programlisting"><span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">impl</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">)</span>
+<span class="special">:</span> <span class="identifier">os_</span><span class="special">(</span><span class="identifier">os</span><span class="special">)</span>
+<span class="special">,</span> <span class="identifier">tsss_</span><span class="special">(</span><span class="identifier">terminate</span><span class="special">)</span>
+<span class="special">,</span> <span class="identifier">thread_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">loop</span><span class="special">,</span> <span class="keyword">this</span><span class="special">))</span>
+<span class="special">{}</span>
+</pre>
+<p>
+ The terminate cleanup function is used to ensure that the queue is empty
+ before the thread finishes. To avoid optimizations a non const call inc is
+ done while waiting the queue empties.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">(</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">async_ostream_thread_ctx</span><span class="special">></span> <span class="identifier">that</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">while</span> <span class="special">(!</span><span class="identifier">that</span><span class="special">-></span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">that</span><span class="special">-></span><span class="identifier">inc</span><span class="special">();</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The central sink function is write. Here instead to lock a mutex the function
+ forwards to the thread specific shared pointer. We will see below how <code class="computeroutput"><span class="identifier">async_ostream_thread_ctx</span></code> handles this call.
+ </p>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">tsss_</span><span class="special">-></span><span class="identifier">write</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">n</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ It is time to analyze the thread specific context before seeing how the concentrator
+ is implemented.
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">async_ostream_thread_ctx</span> <span class="special">{</span>
+ <span class="identifier">async_ostream_thread_ctx</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">flush</span><span class="special">();</span>
+ <span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">get</span><span class="special">();</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="keyword">return</span> <span class="identifier">queue_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();}</span>
+ <span class="keyword">void</span> <span class="identifier">inc</span><span class="special">()</span> <span class="special">{++</span><span class="identifier">inc_</span><span class="special">;}</span>
+<span class="keyword">private</span><span class="special">:</span>
+ <span class="keyword">unsigned</span> <span class="identifier">seq_</span><span class="special">;</span>
+ <span class="identifier">element_type</span> <span class="special">*</span><span class="identifier">current_</span><span class="special">;</span>
+ <span class="identifier">queue_type</span> <span class="identifier">queue_</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mutex_</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span><span class="special">&</span> <span class="identifier">buffer</span><span class="special">()</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">current_</span><span class="special">-></span><span class="identifier">value_</span><span class="special">;}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Each thread has a pointer to the current timestamped stringstream wich is
+ used for the current output flow, i.e. by the write function.
+ </p>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">write</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">buffer</span><span class="special">().</span><span class="identifier">write</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">n</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">n</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Once the user does a flush, the current element is pushed on the queue. The
+ <code class="computeroutput"><span class="identifier">sec_</span></code> integer is used as monotonic
+ sequence in conjuntion with the timestamp.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">flush</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">current_</span><span class="special">-></span><span class="identifier">reset_date</span><span class="special">(</span><span class="identifier">seq_</span><span class="special">);</span>
+ <span class="special">++</span><span class="identifier">seq_</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">size</span><span class="special">()></span><span class="number">2</span><span class="special">)</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">current_</span><span class="special">);</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mutex_</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">current_</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="identifier">current_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">element_type</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ As stated in the introduction, we don't need to lock the mutex if the number
+ of elements in the queue is enough.
+ </p>
+<p>
+ These queue elements will be read by the concentrator using the get function.
+ </p>
+<pre class="programlisting"><span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</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">size</span><span class="special">()></span><span class="number">1</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">get_i</span><span class="special">();</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mutex_</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">get_i</span><span class="special">();</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+<span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">get_i</span><span class="special">()</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">empty</span><span class="special">())</span> <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+ <span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">e</span><span class="special">=</span> <span class="identifier">queue_</span><span class="special">.</span><span class="identifier">front</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="keyword">return</span> <span class="identifier">e</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The concentrator loop looks like:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">async_ostream_sink_impl</span><span class="special">::</span><span class="identifier">loop</span><span class="special">(</span><span class="identifier">async_ostream_sink</span><span class="special">::</span><span class="identifier">impl</span><span class="special">*</span> <span class="identifier">that</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os_</span> <span class="special">=</span> <span class="identifier">that</span><span class="special">-></span><span class="identifier">os_</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(;;)</span> <span class="special">{</span>
+ <span class="comment">// sleeps a little bit
+</span> <span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">posix_time</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+ <span class="special">{</span> <span class="comment">// scope needed don't remove
+</span> <span class="comment">// lock the map access
+</span> <span class="identifier">tsss_type</span><span class="special">::</span><span class="identifier">lock_type</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">that</span><span class="special">-></span><span class="identifier">tsss_</span><span class="special">.</span><span class="identifier">get_mutex</span><span class="special">());</span>
+ <span class="keyword">const</span> <span class="identifier">tsss_type</span><span class="special">::</span><span class="identifier">map_type</span><span class="special">&</span> <span class="identifier">tmap</span><span class="special">(</span><span class="identifier">that</span><span class="special">-></span><span class="identifier">tsss_</span><span class="special">.</span><span class="identifier">get_map</span><span class="special">(</span><span class="identifier">lock</span><span class="special">));</span>
+ <span class="keyword">for</span> <span class="special">(</span><span class="identifier">tsss_type</span><span class="special">::</span><span class="identifier">map_type</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">tmap</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">tmap</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// takes the first element of each thread queue (if it exists) and push it on the ordered queue.
+</span> <span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">e</span><span class="special">=</span> <span class="identifier">it</span><span class="special">-></span><span class="identifier">second</span><span class="special">-></span><span class="identifier">get</span><span class="special">();</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">e</span> <span class="special">!=</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">that</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">e</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">that</span><span class="special">-></span><span class="identifier">queue_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="comment">//when the queue is empty sleeps a little more
+</span> <span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">posix_time</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">10</span><span class="special">));</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="comment">// takes the fist element of the ordered queue, write them on the output stream and delete it.
+</span> <span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">that</span><span class="special">-></span><span class="identifier">queue_</span><span class="special">.</span><span class="identifier">top</span><span class="special">();</span>
+ <span class="identifier">that</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">os_</span> <span class="special"><<</span> <span class="string">"["</span><span class="special"><<</span> <span class="identifier">e</span><span class="special">-></span><span class="identifier">date_</span> <span class="special"><<</span><span class="string">"-"</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">-></span><span class="identifier">seq_</span> <span class="special"><<</span> <span class="string">"] "</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">-></span><span class="identifier">value_</span><span class="special">.</span><span class="identifier">str</span><span class="special">();</span>
+ <span class="keyword">delete</span> <span class="identifier">e</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../examples.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="stm.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,180 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Overview</title>
+<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="prev" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="next" href="overview/motivation.html" title=" Motivation">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="overview/motivation.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="toward_boost_interthreads.overview"></a> Overview
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"> Motivation</span></dt>
+<dd><dl>
+<dt><span class="section">Decorators</span></dt>
+<dt><span class="section"><a href="overview/motivation.html#toward_boost_interthreads.overview.motivation.sharing_thread_local_storage">Sharing
+ Thread Local Storage</a></span></dt>
+<dt><span class="section"><a href="overview/motivation.html#toward_boost_interthreads.overview.motivation.keep_alive_motivation">
+ Keep Alive</a></span></dt>
+<dt><span class="section"><a href="overview/motivation.html#toward_boost_interthreads.overview.motivation.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></dd>
+</dl></div>
+<a name="toward_boost_interthreads.overview.description"></a><h3>
+<a name="id4803164"></a>
+ Description
+ </h3>
+<p>
+ <span class="bold"><strong>Boost.InterThreads</strong></span> extends Boost.Threads adding some features:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ A thread_decoration class allowing to define setup/cleanup functions which
+ will be called only once by thread (if the thread function is decorated with
+ thread_decorator): setup before the thread function and cleanup at thread
+ exit. It is used together with asynchronous_executor_decorator
+ </li>
+<li>
+ A thread_decorator/thread_decorate class/function which decorate a thread
+ function in order to call the setup and the cleanup of all the thread_decorations.
+ </li>
+<li>
+ A thread specific shared pointer which is an extension of the thread_specific_ptr
+ providing access to this thread specific context from other threads. As it
+ is shared the stored pointer is a shared_ptr instead of a raw one.
+ </li>
+<li>
+ A thread keep alive mechanism: this mechanism allows to detect threads that
+ do not prove that they are alive by calling to the keep_alive_point regularly.
+ When a thread is declared dead a user provided function is called, which
+ by default will abort the program.
+ </li>
+<li>
+ A thread static array
+ <div class="itemizedlist"><ul type="circle"><li>
+ thread tuple: defines a thread groupe where the number of threads is
+ know statically and the threads are created at construction time in oposition
+ to a thread_group.
+ </li></ul></div>
+</li>
+<li>
+ A thread static array and a thread group with wait for any feature
+ <div class="itemizedlist"><ul type="circle">
+<li>
+ set_once: a synchonizer that allows to set a variable only once, notifying
+ to the variable value to whatever is waiting for that.
+ </li>
+<li>
+ thread_tuple_once: an extension of the boost::thread_tuple which allows
+ to join the completion of any thread using for that the set_once synchronizer.
+ </li>
+<li>
+ thread_group_once: an extension of the boost::thread_group which allows
+ to join the completion of any thread in the group using for that the
+ set_once synchronizer.
+ </li>
+</ul></div>
+</li>
+</ul></div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ thread_decorator and thread_specific_shared_ptr are based on the original
+ implementation of threadalert written by Roland Schwarz.
+ </p></td></tr>
+</table></div>
+<a name="toward_boost_interthreads.overview.how_to_use_this_documentation"></a><h3>
+<a name="id4764766"></a>
+ <a href="overview.html#toward_boost_interthreads.overview.how_to_use_this_documentation">How
+ to Use This Documentation</a>
+ </h3>
+<p>
+ This documentation makes use of the following naming and formatting conventions.
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ Code is in <code class="computeroutput"><span class="identifier">fixed</span> <span class="identifier">width</span>
+ <span class="identifier">font</span></code> and is syntax-highlighted.
+ </li>
+<li>
+ Replaceable text that you will need to supply is in
+ <em class="replaceable"><code>
+ italics
+ </code></em>
+ .
+ </li>
+<li>
+ If a name refers to a free function, it is specified like this: <code class="computeroutput"><span class="identifier">free_function</span><span class="special">()</span></code>;
+ that is, it is in code font and its name is followed by <code class="computeroutput"><span class="special">()</span></code>
+ to indicate that it is a free function.
+ </li>
+<li>
+ If a name refers to a class template, it is specified like this: <code class="computeroutput"><span class="identifier">class_template</span><span class="special"><></span></code>;
+ that is, it is in code font and its name is followed by <code class="computeroutput"><span class="special"><></span></code>
+ to indicate that it is a class template.
+ </li>
+<li>
+ If a name refers to a function-like macro, it is specified like this: <code class="computeroutput"><span class="identifier">MACRO</span><span class="special">()</span></code>;
+ that is, it is uppercase in code font and its name is followed by <code class="computeroutput"><span class="special">()</span></code> to indicate that it is a function-like
+ macro. Object-like macros appear without the trailing <code class="computeroutput"><span class="special">()</span></code>.
+ </li>
+<li>
+ Names that refer to <span class="emphasis"><em>concepts</em></span> in the generic programming
+ sense are specified in CamelCase.
+ </li>
+</ul></div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ In addition, notes such as this one specify non-essential information that
+ provides additional background or rationale.
+ </p></td></tr>
+</table></div>
+<p>
+ Finally, you can mentally add the following to any code fragments in this document:
+ </p>
+<pre class="programlisting"><span class="comment">// Include all of InterThreads
+</span><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="comment">// Create a namespace aliases
+</span><span class="keyword">namespace</span> <span class="identifier">bith</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">;</span>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="overview/motivation.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview/motivation.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/overview/motivation.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,271 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Motivation</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../overview.html" title=" Overview">
+<link rel="prev" href="../overview.html" title=" Overview">
+<link rel="next" href="../users_guide.html" title=" Users'Guide">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../overview.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../users_guide.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.overview.motivation"></a> Motivation
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Decorators</span></dt>
+<dt><span class="section"><a href="motivation.html#toward_boost_interthreads.overview.motivation.sharing_thread_local_storage">Sharing
+ Thread Local Storage</a></span></dt>
+<dt><span class="section"><a href="motivation.html#toward_boost_interthreads.overview.motivation.keep_alive_motivation">
+ Keep Alive</a></span></dt>
+<dt><span class="section"><a href="motivation.html#toward_boost_interthreads.overview.motivation.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.overview.motivation.decorators"></a>Decorators
+</h4></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code> provides a mechanism for ensuring
+ that an initialization routine is run exactly once on a programm without
+ data races or deadlocks. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">at_thread_exit</span></code>
+ allows to execute a cleanup function at thread exit.
+ </p>
+<p>
+ If we want a setup function to be executed once at the begining on the
+ threads and a cleanup at thread exit we need to do
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread_main</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">setup</span><span class="special">();</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">at_thread_exit</span><span class="special">(</span><span class="identifier">cleanup</span><span class="special">);</span>
+ <span class="comment">// do whatever
+</span> <span class="comment">// ...
+</span><span class="special">}</span>
+<span class="comment">// ...
+</span><span class="special">{</span>
+ <span class="identifier">launch</span><span class="special">(</span><span class="identifier">thread_main</span><span class="special">);</span>
+ <span class="comment">//...
+</span><span class="special">}</span>
+</pre>
+<p>
+ Of course we can define an init function that calls setup and do the registration.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">init</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">setup</span><span class="special">();</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">at_thread_exit</span><span class="special">(</span><span class="identifier">cleanup</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Different services could require these setup/cleanup functions to be called,
+ and so each thread function should do
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread_main</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">serv1</span><span class="special">::</span><span class="identifier">init</span><span class="special">();</span>
+ <span class="comment">// ...
+</span> <span class="identifier">servN</span><span class="special">::</span><span class="identifier">init</span><span class="special">();</span>
+ <span class="comment">// do whatever using serv1, ..., servN.
+</span> <span class="comment">// ...
+</span><span class="special">}</span>
+</pre>
+<p>
+ This approach is valid for services that the user can configure for specifics
+ threads, but not for services that must be installed on every thread.
+ </p>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_decoration</span></code> ensures
+ that a setup function is called only once by thread before the thread function
+ provided the thread is created with a decorator wrapper. This setup function
+ is usualy used to set thread specific pointers and call functions once.
+ </p>
+<p>
+ The conterpart of the setup is the cleanup. The <code class="computeroutput"><span class="identifier">thread_decoration</span></code>
+ takes an optional cleanup function which will be executed at thread exit.
+ </p>
+<pre class="programlisting"><span class="comment">// define in only the implementation file of each service
+</span>
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">::</span><span class="identifier">decoration</span> <span class="identifier">serv1</span><span class="special">:</span><span class="identifier">decoration</span><span class="special">(</span><span class="identifier">serv1</span><span class="special">:</span><span class="identifier">setup</span><span class="special">,</span> <span class="identifier">serv1</span><span class="special">:</span><span class="identifier">cleanup</span><span class="special">);</span>
+<span class="comment">// ...
+</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">::</span><span class="identifier">decoration</span> <span class="identifier">servN</span><span class="special">:</span><span class="identifier">decoration</span><span class="special">(</span><span class="identifier">servN</span><span class="special">:</span><span class="identifier">setup</span><span class="special">,</span> <span class="identifier">servN</span><span class="special">:</span><span class="identifier">cleanup</span><span class="special">);</span>
+
+
+<span class="keyword">void</span> <span class="identifier">thread_main</span><span class="special">()</span> <span class="special">{</span>
+ <span class="comment">// do whatever using serv1, ..., servN.
+</span> <span class="comment">// ...
+</span><span class="special">}</span>
+
+<span class="comment">// ...
+</span><span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">::</span><span class="identifier">make_decorator</span><span class="special">(</span><span class="identifier">thread_main</span><span class="special">));</span>
+ <span class="comment">//...
+</span><span class="special">}</span>
+</pre>
+<p>
+ We can use a basic_threader_decorator as asynchronous executor to fork
+ thread_main.
+ </p>
+<pre class="programlisting"><span class="comment">// ...
+</span><span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">=</span><span class="identifier">fork</span><span class="special">(</span><span class="identifier">basic_threader_decorator</span><span class="special">(),</span> <span class="identifier">thread_main</span><span class="special">);</span>
+ <span class="comment">//...
+</span><span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.overview.motivation.sharing_thread_local_storage"></a><a href="motivation.html#toward_boost_interthreads.overview.motivation.sharing_thread_local_storage" title="Sharing
+ Thread Local Storage">Sharing
+ Thread Local Storage</a>
+</h4></div></div></div>
+<p>
+ Thread local storage allows multi-threaded applications to have a separate
+ instance of a given data item for each thread. But does not provide any
+ mechanism to access this data from other threads. Although this seems to
+ defeat the whole point of thread-specific storage, it is useful when these
+ contexts need some kind of communication between them, or some central
+ global object needs to control them.
+ </p>
+<p>
+ The intent of the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span></code>
+ class is to allow two threads to establish a shared memory space, without
+ requiring the user code to pass any information. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span></code>
+ provides a portable mechanism for shared thread-local storage that works
+ on all compilers supported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>
+ and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span></code>. Each instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span></code> represents
+ a pointer to a shared object where each thread must have a distinct value.
+ </p>
+<p>
+ Only the current thread can modify the thread specific shared pointer using
+ the non const functions reset/release functions. Each time these functions
+ are used, a synchronization must be ensured to update the mapping. The
+ other threads have only read access to the shared_ptr<T>. It is worth
+ saying that the shared object T must be thread safe.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.overview.motivation.keep_alive_motivation"></a><a href="motivation.html#toward_boost_interthreads.overview.motivation.keep_alive_motivation" title="
+ Keep Alive">
+ Keep Alive</a>
+</h4></div></div></div>
+<p>
+ On fault tolerant systems we need to be able to detect threads that could
+ stay on a loop, or simply blocked.
+ </p>
+<p>
+ One way to detect this situations is to require the thread to signal it
+ is alive by calling a check point function. Of course it should be up to
+ the user to state when this mechanism is enabled or disabled. At the begining
+ of a thread the keep alive mechanism is disabled.
+ </p>
+<p>
+ A thread will be considered dead if during a given period the number of
+ checkins is inferior to a given threshold. These two parameters can be
+ given when the keep alive mechanislm is enabled.
+ </p>
+<p>
+ The controler checks at predefined intervals if the thread is dead, and
+ in this case it will call a user specific function which by default aborts
+ the program.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.overview.motivation.thread_tuple"></a><a href="motivation.html#toward_boost_interthreads.overview.motivation.thread_tuple" title="Thread
+ Tuple">Thread
+ Tuple</a>
+</h4></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">boots</span><span class="special">::</span><span class="identifier">thread_group</span></code> class allows to group dynamically
+ threads. This means that the container must be dynamic.
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_group</span> <span class="identifier">tg</span><span class="special">;</span>
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">);</span>
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">thread2</span><span class="special">);</span>
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ class is responsible for launching and managing a static collection of
+ threads that are related in some way. No new threads can be added to the
+ tuple once constructed. So we can write
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">tt</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">,</span> <span class="identifier">thread2</span><span class="special">);</span>
+ <span class="identifier">tt</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ As this
+ </p>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">conc_join_all</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">,</span> <span class="identifier">thread2</span><span class="special">);</span>
+</pre>
+<p>
+ In addition the user can join the first finishing thread.
+ </p>
+<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">conc_join_any</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">,</span> <span class="identifier">thread2</span><span class="special">);</span>
+</pre>
+<p>
+ Evidently, thread_tuple can not be used when we need dynamic creation or
+ deletion. The <code class="computeroutput"><span class="identifier">boots</span><span class="special">::</span><span class="identifier">thread_group</span></code> class allows to group dynamically
+ threads.
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_group</span> <span class="identifier">tg</span><span class="special">;</span>
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">);</span>
+
+ <span class="comment">// later on
+</span> <span class="identifier">tg</span><span class="special">.</span><span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">thread2</span><span class="special">);</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th3</span><span class="special">(</span><span class="identifier">thread3</span><span class="special">)</span>
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">add_thread</span><span class="special">(</span><span class="identifier">th3</span><span class="special">);</span>
+
+ <span class="comment">// later on
+</span> <span class="identifier">tg</span><span class="special">.</span><span class="identifier">remove_thread</span><span class="special">(</span><span class="identifier">th3</span><span class="special">);</span>
+
+ <span class="identifier">tg</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">(</span><span class="identifier">thread1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Objects of type <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> are movable, so they can be stored
+ in move-aware containers, and returned from functions. This allows the
+ details of thread tuple creation to be wrapped in a function.
+ </p>
+<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">make_thread_tuple</span><span class="special">(...);</span>
+
+<span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">some_thread_tuple</span><span class="special">=</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_thread_tuple</span><span class="special">(</span><span class="identifier">f1</span><span class="special">,</span> <span class="identifier">g2</span><span class="special">);</span>
+ <span class="identifier">some_thread_tuple</span><span class="special">.</span><span class="identifier">join</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../overview.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../users_guide.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Reference</title>
+<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="prev" href="users_guide/glosary.html" title=" Glossary">
+<link rel="next" href="reference/concepts.html" title="Concepts">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="users_guide/glosary.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="reference/concepts.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="toward_boost_interthreads.reference"></a> Reference
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Concepts</span></dt>
+<dd><dl><dt><span class="section">Decorator</span></dt></dl></dd>
+<dt><span class="section"><a href="reference/thread_extensions_reference.html">Thread
+ Extensions Reference</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="reference/thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decoration</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_specific_shared_ptr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_keep_alive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="reference/thread_array_reference.html">Thread
+ Array Reference</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="reference/thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">set_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dt><span class="section"><a href="reference/thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_group_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+</dl></dd>
+</dl></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="users_guide/glosary.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="reference/concepts.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/concepts.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/concepts.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,48 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Concepts</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../reference.html" title=" Reference">
+<link rel="prev" href="../reference.html" title=" Reference">
+<link rel="next" href="thread_extensions_reference.html" title="Thread
+ Extensions 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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../reference.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="thread_extensions_reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.reference.concepts"></a>Concepts
+</h3></div></div></div>
+<div class="toc"><dl><dt><span class="section">Decorator</span></dt></dl></div>
+<div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.concepts.decorator"></a>Decorator
+</h4></div></div></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../reference.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="thread_extensions_reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_array_reference.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_array_reference.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,1429 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Thread
+ Array Reference</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../reference.html" title=" Reference">
+<link rel="prev" href="thread_extensions_reference.html" title="Thread
+ Extensions Reference">
+<link rel="next" href="../examples.html" title="Examples">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="thread_extensions_reference.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../examples.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference"></a><a href="thread_array_reference.html" title="Thread
+ Array Reference">Thread
+ Array Reference</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">set_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl><dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp.set_onceclass">
+ Template Class <code class="computeroutput"><span class="identifier">set_once</span><span class="special"><></span></code></a></span></dt></dl></dd>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_make_thread_tuple">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple</span><span class="special">()</span></code></a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_make_thread_tuple_once">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple_once</span><span class="special">()</span></code></a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_group_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_make_thread_group_once">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_group_once</span><span class="special">()</span></code></a></span></dt>
+</dl></dd>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.set_once_hpp"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp" title="
+ Header <boost/interthreads/set_once.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">set_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp.set_onceclass">
+ Template Class <code class="computeroutput"><span class="identifier">set_once</span><span class="special"><></span></code></a></span></dt></dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">set_once</span><span class="special">;</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.set_once_hpp.set_onceclass"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.set_once_hpp.set_onceclass" title="
+ Template Class set_once<>">
+ Template Class <code class="computeroutput"><span class="identifier">set_once</span><span class="special"><></span></code></a>
+</h5></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">set_once</span><span class="special"><></span></code>
+ is a synchonizer that allows to set a variable only once, notifying to
+ the variable value to whatever is waiting for that.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">set_once</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
+
+ <span class="identifier">set_once</span><span class="special">();</span>
+ <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">TimeDuration</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="identifier">value_type</span> <span class="identifier">get</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">get_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">get_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">TimeDuration</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="keyword">bool</span> <span class="identifier">set_if_unassigned</span><span class="special">(</span><span class="identifier">value_type</span> <span class="identifier">id</span><span class="special">);</span>
+
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+ <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">decorator</span><span class="special">(</span><span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">once</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">fct</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+ <span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">make_thread</span><span class="special">(</span><span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">once</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">fct</span><span class="special">);</span>
+<span class="special">};</span>
+</pre>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp" title="
+ Header <boost/interthreads/thread_tuple.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_make_thread_tuple">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">thread_tuple</span><span class="special">;</span>
+
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+ <span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">></span> <span class="identifier">make_thread_tuple</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class" title="
+ Template Class thread_tuple<>">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.template_parameters">Template
+ parameters</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_callable_constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_destructor">
+ Destructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_joinable">
+ Member function <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_join">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_until___">Member
+ function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_for___">Member
+ function <code class="computeroutput"><span class="identifier">join_all_for</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.join_first_then_interrupt">
+ Member function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_any_until___">Member
+ function <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.detach_all">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_interrupt_all">
+ Member function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_size">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ defines a thread groupe where the number of threads is know statically
+ and the threads are created at construction time.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">thread_tuple</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+ <span class="identifier">thread_tuple</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
+ <span class="identifier">thread_tuple</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span> <span class="identifier">f</span><span class="special">);</span>
+ <span class="special">~</span><span class="identifier">thread_tuple</span><span class="special">();</span>
+
+ <span class="comment">// move support
+</span> <span class="identifier">thread_tuple</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">thread_tuple</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="keyword">operator</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">>>();</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">move</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="identifier">n</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">);</span>
+
+ <span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">();</span>
+ <span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span>
+ <span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+
+ <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">();</span>
+
+ <span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">i</span><span class="special">);</span>
+<span class="special">};</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ class is responsible for launching and managing a static collection of
+ threads that are related in some fashion. No new threads can be added
+ to the tuple once constructed.
+ </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.template_parameters"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.template_parameters" title="Template
+ parameters">Template
+ parameters</a>
+</h6></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ is instantiated with the following value:
+ </p>
+<div class="itemizedlist"><ul type="disc"><li>
+ n is the size of the tuple.
+ </li></ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_callable_constructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_callable_constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+<span class="identifier">thread_tuple</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">func_0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span> <span class="identifier">func_n</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Preconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Fk</span></code> must by copyable.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func_k</span></code> is copied
+ into storage managed internally by the library, and that copy is
+ invoked on a newly-created thread of execution. If this invocation
+ results in an exception being propagated into the internals of
+ the library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>,
+ then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code>
+ will be called.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to the newly created tuple of threads of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
+ occurs.
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Currently up to ten arguments <code class="computeroutput"><span class="identifier">func_0</span></code>
+ to <code class="computeroutput"><span class="identifier">funct_9</span></code> can
+ be specified.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_destructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_tuple</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ If *this have associateds thread of execution, calls detach() on
+ them. Destroys *this.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_joinable"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_joinable" title="
+ Member function joinable()">
+ Member function <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to threads of execution, <code class="computeroutput"><span class="keyword">false</span></code>
+ otherwise.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_join"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_join" title="
+ Member function join_all()">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span>
+<span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><>::</span><span class="identifier">join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_until___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_until___" title="Member
+ function join_all_until()">Member
+ function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code> on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>
+ object in the tuple.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><>::</span><span class="identifier">join_all_until</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_for___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_all_for___" title="Member
+ function join_all_for()">Member
+ function <code class="computeroutput"><span class="identifier">join_all_for</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">join_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ As <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">(</span><span class="identifier">now</span><span class="special">()+</span><span class="identifier">rel_time</span><span class="special">)</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><>::</span><span class="identifier">join_all_for</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.join_first_then_interrupt"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.join_first_then_interrupt" title="
+ Member function join_any()">
+ Member function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">conc_join_any</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code>
+ on a temporary thread_tuple and the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code> is one of the predefined interruption
+ points, <code class="computeroutput"><span class="identifier">conc_join_any</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_any_until___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.member_function__join_any_until___" title="Member
+ function join_any_until()">Member
+ function <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">conc_join_any_until</span><span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_for</span><span class="special">(</span>
+ <span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code> on a temporary thread_tuple and
+ the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code> is one of the predefined interruption
+ points, <code class="computeroutput"><span class="identifier">conc_join_any_until</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.detach_all"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.detach_all" title="
+ Member function detach_all()">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_interrupt_all"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_interrupt_all" title="
+ Member function interrupt_all()">
+ Member function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">interrupt</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_size"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_class.thread_tuple_size" title="
+ Member function size()">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">size</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ The number of threads in the tuple.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_make_thread_tuple"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_hpp.thread_tuple_make_thread_tuple" title="
+ Non Member Function make_thread_tuple()">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+<span class="identifier">thread_tuple</span> <span class="identifier">make_thread_tuple</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ makes a new thread_tuple<>.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ the created thread tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp" title="
+ Header <boost/interthreads/thread_tuple_once.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_tuple_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_make_thread_tuple_once">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple_once</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">thread_tuple_once</span><span class="special">;</span>
+
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+ <span class="identifier">thread_tuple</span> <span class="identifier">make_thread_tuple_once</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class" title="
+ Template Class thread_tuple_once<>">
+ Template Class <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><></span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.template_parameters">Template
+ parameters</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_callable_constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_destructor">
+ Destructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_joinable">
+ Member function <code class="computeroutput"><span class="identifier">joinables</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_join">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_all_until___">Member
+ function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_any___">Member
+ function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.timed_join_first_then_interrupt">
+ Member function <code class="computeroutput"><span class="identifier">timed_join_first_then_interrupt</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.detach_all">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_interrupt_all">
+ Member function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_size">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">biththread_tuple_once</span></code>
+ is an extension of the <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span></code>
+ which allows to join the thread finishing the first, using for that the
+ <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">set_once</span></code> synchronizer.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">thread_tuple_once</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+ <span class="identifier">thread_tuple_once</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span>
+ <span class="identifier">thread_tuple_once</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span> <span class="identifier">f</span><span class="special">);</span>
+ <span class="special">~</span><span class="identifier">thread_tuple_once</span><span class="special">();</span>
+
+ <span class="comment">// move support
+</span> <span class="identifier">thread_tuple_once</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">thread_tuple_once</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="keyword">operator</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>>();</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_tuple_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">move</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread_tuple_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">);</span>
+
+ <span class="keyword">bool</span> <span class="identifier">joinables</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">join_any</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_until</span><span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_for</span><span class="special">(</span>
+ <span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+
+ <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">();</span>
+
+ <span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">i</span><span class="special">);</span>
+<span class="special">};</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The __thread_tuple<span class="underline">once</span>_ class is
+ responsible for launching and managing a static collection of threads
+ that are related in some fashion. No new threads can be added to the
+ tuple once constructed.
+ </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.template_parameters"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.template_parameters" title="Template
+ parameters">Template
+ parameters</a>
+</h6></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><></span></code>
+ is instantiated with the following value:
+ </p>
+<div class="itemizedlist"><ul type="disc"><li>
+ n is the size of the tuple.
+ </li></ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_callable_constructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_callable_constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+<span class="identifier">thread_tuple_once</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">func_0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span> <span class="identifier">func_n</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Preconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Fk</span></code> must by copyable.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func_k</span></code> is copied
+ into storage managed internally by the library, and that copy is
+ invoked on a newly-created thread of execution. If this invocation
+ results in an exception being propagated into the internals of
+ the library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>,
+ then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code>
+ will be called.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to the newly created tuple of threads of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
+ occurs.
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Currently up to ten arguments <code class="computeroutput"><span class="identifier">func_0</span></code>
+ to <code class="computeroutput"><span class="identifier">funct_9</span></code> can
+ be specified.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_destructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_tuple_once</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ If *this have associateds thread of execution, calls detach() on
+ them. Destroys *this.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_joinable"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_joinable" title="
+ Member function joinables()">
+ Member function <code class="computeroutput"><span class="identifier">joinables</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinables</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to threads of execution, <code class="computeroutput"><span class="keyword">false</span></code>
+ otherwise.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_join"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_join" title="
+ Member function join_all()">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><>::</span><span class="identifier">join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_all_until___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_all_until___" title="Member
+ function join_all_until()">Member
+ function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">join_all_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code> on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>
+ object in the tuple.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><>::</span><span class="identifier">timed_join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_any___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.member_function__join_any___" title="Member
+ function join_any()">Member
+ function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">join_any</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join_first</span><span class="special">()</span></code> and the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><>::</span><span class="identifier">join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.timed_join_first_then_interrupt"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.timed_join_first_then_interrupt" title="
+ Member function timed_join_first_then_interrupt()">
+ Member function <code class="computeroutput"><span class="identifier">timed_join_first_then_interrupt</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">timed_join_first_then_interrupt</span><span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">timed_join_first_then_interrupt</span><span class="special">(</span>
+ <span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">timed_join_first</span><span class="special">()</span></code> and the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the tuple has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_tuple_once</span><span class="special"><>::</span><span class="identifier">timed_join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.detach_all"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.detach_all" title="
+ Member function detach_all()">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_interrupt_all"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_interrupt_all" title="
+ Member function interrupt_all()">
+ Member function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">interrupt</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_size"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_class.thread_tuple_once_size" title="
+ Member function size()">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">size</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ The number of threads in the tuple.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_make_thread_tuple_once"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_tuple_once_hpp.thread_tuple_once_make_thread_tuple_once" title="
+ Non Member Function make_thread_tuple_once()">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_tuple_once</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+<span class="identifier">thread_tuple_once</span> <span class="identifier">make_thread_tuple_once</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ makes a new thread_tuple_once<>.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ the created thread tuple.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp" title="
+ Header <boost/interthreads/thread_group_once.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_group_once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class">
+ Template Class <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><></span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_make_thread_group_once">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_group_once</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">thread_group</span><span class="special">;</span>
+
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class" title="
+ Template Class thread_group_once<>">
+ Template Class <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><></span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_callable_constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_destructor">
+ Destructor</a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_joinable">
+ Member function <code class="computeroutput"><span class="identifier">joinables</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_join">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_timed_join">
+ Member function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.join_first_then_interrupt">
+ Member function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.timed_join_first_then_interrupt">
+ Member function <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.detach_all">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.member_function__interrupt_all___">Member
+ function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_size">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><></span></code>
+ is an extension of the boost::thread_group which allows to join the thread
+ finishing the first, using for that the set_once synchronizer.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">thread_group_once</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">thread_group_once</span><span class="special">();</span>
+ <span class="special">~</span><span class="identifier">thread_group_once</span><span class="special">();</span>
+
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+ <span class="identifier">thread</span><span class="special">*</span> <span class="identifier">create_thread</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">threadfunc</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">remove_thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">*</span> <span class="identifier">thrd</span><span class="special">);</span>
+
+ <span class="comment">// move support
+</span> <span class="identifier">thread_group_once</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_group_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">thread_group_once</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_group_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">x</span><span class="special">);</span>
+ <span class="keyword">operator</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_group_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>>();</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_t</span><span class="special"><</span><span class="identifier">thread_group_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>></span> <span class="identifier">move</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread_group_once</span><span class="special"><</span><span class="identifier">n</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">);</span>
+
+ <span class="keyword">bool</span> <span class="identifier">joinables</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+
+ <span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="keyword">bool</span> <span class="identifier">join_all_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">join_any</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_until</span><span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_for</span><span class="special">(</span>
+ <span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+
+ <span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+
+ <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">();</span>
+
+ <span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">i</span><span class="special">);</span>
+<span class="special">};</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_callable_constructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_callable_constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">thread_group_once</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ creates a thread group.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to the newly created group of threads of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
+ occurs.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_destructor"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_group_once</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ If *this have associateds thread of execution, calls detach() on
+ them. Destroys *this.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_joinable"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_joinable" title="
+ Member function joinables()">
+ Member function <code class="computeroutput"><span class="identifier">joinables</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinables</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to threads of execution, <code class="computeroutput"><span class="keyword">false</span></code>
+ otherwise.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_join"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_join" title="
+ Member function join_all()">
+ Member function <code class="computeroutput"><span class="identifier">join_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the group.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the group has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><>::</span><span class="identifier">join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_timed_join"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_timed_join" title="
+ Member function join_all_until()">
+ Member function <code class="computeroutput"><span class="identifier">join_all_until</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">join_all_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">join_all_for</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code> on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>
+ object in the group.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the group has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><>::</span><span class="identifier">timed_join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.join_first_then_interrupt"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.join_first_then_interrupt" title="
+ Member function join_any()">
+ Member function <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">join_any</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">join_any</span><span class="special">()</span></code>
+ and the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the group has terminated.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">join_any</span></code>
+ is one of the predefined interruption points, <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><>::</span><span class="identifier">join_any</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.timed_join_first_then_interrupt"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.timed_join_first_then_interrupt" title="
+ Member function join_any_until()">
+ Member function <code class="computeroutput"><span class="identifier">join_any_until</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_until</span><span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span>
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">join_any_for</span><span class="special">(</span>
+ <span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">get_until</span><span class="special">()</span></code> and the <code class="computeroutput"><span class="identifier">interrup_all</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ Every thread in the group has terminated.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ true if joined.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Note:</span></dt>
+<dd><p>
+ Since <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span></code> is one of the predefined
+ interruption points, <code class="computeroutput"><span class="identifier">thread_group_once</span><span class="special"><>::</span><span class="identifier">timed_join_all</span><span class="special">()</span></code> is also an interruption point.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.detach_all"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.detach_all" title="
+ Member function detach_all()">
+ Member function <code class="computeroutput"><span class="identifier">detach_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the group.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.member_function__interrupt_all___"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.member_function__interrupt_all___" title="Member
+ function interrupt_all()">Member
+ function <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">interrupt_all</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Call <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">interrupt</span><span class="special">()</span></code>
+ on each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> object in the group.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_size"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_class.thread_group_once_size" title="
+ Member function size()">
+ Member function <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">size</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ The number of threads in the group.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_make_thread_group_once"></a><a href="thread_array_reference.html#toward_boost_interthreads.reference.thread_array_reference.thread_group_once_hpp.thread_group_once_make_thread_group_once" title="
+ Non Member Function make_thread_group_once()">
+ Non Member Function <code class="computeroutput"><span class="identifier">make_thread_group_once</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">-</span><span class="number">1</span><span class="special">></span>
+<span class="identifier">thread_group_once</span> <span class="identifier">make_thread_group_once</span><span class="special">(</span><span class="identifier">F0</span> <span class="identifier">f0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">-</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ makes a new thread_group_once<>.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ the created thread group.
+ </p></dd>
+</dl>
+</div>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="thread_extensions_reference.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../examples.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_extensions_reference.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/reference/thread_extensions_reference.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,1424 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Thread
+ Extensions Reference</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../reference.html" title=" Reference">
+<link rel="prev" href="concepts.html" title="Concepts">
+<link rel="next" href="thread_array_reference.html" title="Thread
+ Array 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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="concepts.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="thread_array_reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference"></a><a href="thread_extensions_reference.html" title="Thread
+ Extensions Reference">Thread
+ Extensions Reference</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decoration</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl><dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration">
+ Class <code class="computeroutput"><span class="identifier">thread_decoration</span></code></a></span></dt></dl></dd>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator">
+ Class <code class="computeroutput"><span class="identifier">thread_decorator</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.decorate">
+ Non Member Function <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code></a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_specific_shared_ptr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl><dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr">
+ Template Class <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code></a></span></dt></dl></dd>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_keep_alive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">enable_keep_alive</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">disable_keep_alive</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_check_point">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_check_point</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_enabled">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_enabled</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_set_on_dead_thread">
+ Non Member Function <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code></a></span></dt>
+</dl></dd>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp" title="
+ Header <boost/interthreads/thread_decoration.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decoration</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration">
+ Class <code class="computeroutput"><span class="identifier">thread_decoration</span></code></a></span></dt></dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+ <span class="keyword">class</span> <span class="identifier">thread_decoration</span><span class="special">;</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration" title="
+ Class thread_decoration">
+ Class <code class="computeroutput"><span class="identifier">thread_decoration</span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.thread_decoration_class_constructor_setup">
+ Constructor with setup</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.constructor_with_setup___cleanup">Constructor
+ with setup & cleanup</a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_decoration</span></code> defines
+ a couple of setup/cleanup functions chained to the last constructed decoration,
+ i.e. decorations are chained between them.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">thread_decoration</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable1</span><span class="special">></span>
+ <span class="identifier">thread_decoration</span><span class="special">(</span><span class="identifier">Callable1</span> <span class="identifier">setup</span><span class="special">);</span>
+
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Callable2</span><span class="special">></span>
+ <span class="identifier">thread_decoration</span><span class="special">(</span><span class="identifier">Callable1</span> <span class="identifier">setup</span><span class="special">,</span> <span class="identifier">Callable2</span> <span class="identifier">cleanup</span><span class="special">);</span>
+
+ <span class="special">~</span><span class="identifier">thread_decoration</span><span class="special">()</span> <span class="special">{</span>
+<span class="special">};</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.thread_decoration_class_constructor_setup"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.thread_decoration_class_constructor_setup" title="
+ Constructor with setup">
+ Constructor with setup</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span>
+<span class="identifier">thread_decoration</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> is <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>. Copying <code class="computeroutput"><span class="identifier">setup</span></code> shall have no side effects,
+ and the effect of calling the copy shall be equivalent to calling
+ the original.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">setup</span></code> is copied
+ into storage managed internally by the library, and that copy is
+ invoked by the <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code> function.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to a decoration.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ unsafe
+ </p></dd>
+</dl>
+</div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The library do not ensures any order of decorations.
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.constructor_with_setup___cleanup"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decoration_hpp.thread_decoration.constructor_with_setup___cleanup" title="Constructor
+ with setup & cleanup">Constructor
+ with setup & cleanup</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Callable2</span><span class="special">></span>
+<span class="identifier">thread_decoration</span><span class="special">(</span><span class="identifier">Callable1</span> <span class="identifier">setup</span><span class="special">,</span> <span class="identifier">Callable2</span> <span class="identifier">cleanup</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable1</span></code> &
+ <code class="computeroutput"><span class="identifier">Callable1</span></code> are
+ <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
+ Copying <code class="computeroutput"><span class="identifier">setup</span></code> or
+ <code class="computeroutput"><span class="identifier">cleanup</span></code> shall have
+ no side effects, and the effect of calling the copy shall be equivalent
+ to calling the original.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">setup</span></code> and <code class="computeroutput"><span class="identifier">cleanup</span></code> are copied into storage
+ managed internally by the library, and the <code class="computeroutput"><span class="identifier">setup</span></code>
+ copy is invoked by the <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code> function. If successful the cleanup
+ function is registered to the to the thread exit handler.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ refers to a decoration.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ unsafe
+ </p></dd>
+</dl>
+</div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The library do not ensures any order of setup decorations neither
+ of cleanup decorations.
+ </p></td></tr>
+</table></div>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp" title="
+ Header <boost/interthreads/thread_decorator.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator">
+ Class <code class="computeroutput"><span class="identifier">thread_decorator</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.decorate">
+ Non Member Function <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+ <span class="keyword">class</span> <span class="identifier">thread_decorator</span><span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">decorate</span><span class="special">();</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator" title="
+ Class thread_decorator">
+ Class <code class="computeroutput"><span class="identifier">thread_decorator</span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructorn">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_move_constructor">
+ Copy Move Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_constructor">
+ Assign Move Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_conversion">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">>()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_move">
+ Member Function <code class="computeroutput"><span class="identifier">move</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_swap">
+ Member Function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_operator_f">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_decorator</span></code> is a
+ functor wrapping a function with the setup and the cleanup of chained
+ decorations which will be called only once by thread: decoration's setup
+ are called before the thread function and decoration's cleanup at thread
+ exit.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">thread_decorator</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Callable</span><span class="special">></span>
+ <span class="keyword">explicit</span> <span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span>
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Callable</span><span class="special">></span>
+ <span class="keyword">explicit</span> <span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">Callable</span><span class="special">></span> <span class="identifier">f</span><span class="special">):</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span>
+ <span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">f</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">disable_if</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">F</span><span class="special">&,</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span> <span class="special">></span>
+ <span class="special">,</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">dummy</span><span class="special">*</span> <span class="special">>::</span><span class="identifier">type</span><span class="special">=</span><span class="number">0</span><span class="special">);</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A2</span><span class="special">,</span> <span class="special">...></span>
+ <span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...)</span>
+
+ <span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
+
+ <span class="identifier">thread_decorator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
+
+ <span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">move</span><span class="special">();</span>
+
+ <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread_decorator</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span>
+
+ <span class="keyword">void</span> <span class="keyword">operator</span> <span class="special">()();</span>
+
+<span class="special">};</span>
+</pre>
+<p>
+ Functor wrapping the user function thread to ensure that all the decorations
+ are called.
+ </p>
+<p>
+ Objects of type <code class="computeroutput"><span class="identifier">thread_decorator</span></code>
+ are movable, so they can be stored in move-aware containers, and returned
+ from functions. This allows the details of thread decoration to be wrapped
+ in a function.
+ </p>
+<pre class="programlisting"><span class="identifier">thread_decorator</span> <span class="identifier">make_decorator</span><span class="special">();</span>
+
+<span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">boot</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">some_thread</span><span class="special">(</span><span class="identifier">make_decorator</span><span class="special">());</span>
+ <span class="identifier">some_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+ On compilers that support rvalue references, <code class="computeroutput"><span class="identifier">thread_decorator</span></code>
+ will provides a proper move constructor and move-assignment operator,
+ and therefore meets the C++0x <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
+ and <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>
+ concepts. With such compilers, <code class="computeroutput"><span class="identifier">thread_decorator</span></code>
+ can therefore be used with containers that support those concepts.
+ </p>
+<p>
+ For other compilers, move support is provided with a move emulation
+ layer, so containers must explicitly detect that move emulation layer.
+ See <code class="computeroutput"><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">detail</span><span class="special">/</span><span class="identifier">move</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> for details.
+ </p>
+</td></tr>
+</table></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Callable</span><span class="special">></span>
+<span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span>
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span>
+<span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Template parameters:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> must by
+ <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func</span></code> is copied
+ into storage managed internally by the library, and that copy will
+ be invoked after the operator() function when the decorate is used
+ as Callable of a newly-created thread of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructorn"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_constructorn" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A2</span><span class="special">,</span> <span class="special">...></span>
+<span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...)</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Template parameters:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> must by
+ <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func</span></code> is copied
+ into storage managed internally by the library, and that copy will
+ be invoked after the operator() function when the decorate is used
+ as Callable of a newly-created thread of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe
+ </p></dd>
+<dt><span class="term">Limitations:</span></dt>
+<dd><p>
+ The current implementation defines overloads up to four parameters.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_move_constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_move_constructor" title="
+ Copy Move Constructor">
+ Copy Move Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
+<span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">></span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Template parameters:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> must by
+ <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func</span></code> is copied
+ into storage managed internally by the library, and that copy will
+ be invoked after the operator() function when the decorate is used
+ as Callable of a newly-created thread of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_decorate_copy_constructor" title="
+ Assign Move Constructor">
+ Assign Move Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">thread_decorator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span>
+<span class="identifier">thread_decorator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">></span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> must by
+ <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">func</span></code> is copied
+ into storage managed internally by the library, and that copy will
+ be invoked after the operator() function when the decorate is used
+ as Callable of a newly-created thread of execution.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ a reference to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ neutral
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_conversion"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_conversion" title="
+ Member Function operator detail::thread_move_t<thread_decorator>()">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">>()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">operator</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">>();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ helper for move semantics emulation.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ the move form <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ neutral
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_move"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_move" title="
+ Member Function move()">
+ Member Function <code class="computeroutput"><span class="identifier">move</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread_decorator</span><span class="special">></span> <span class="identifier">move</span><span class="special">()</span> <span class="special">{</span>
+<span class="identifier">thread_decorator</span><span class="special">&&</span> <span class="identifier">move</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Move *this to the caller.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ the move form <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ neutral
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_swap"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_swap" title="
+ Member Function swap()">
+ Member Function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread_decorator</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ neutral
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_operator_f"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.thread_decorator.decorator_thread_decoration_operator_f" title="
+ Member Function operator()()">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Functor operator
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Any exception thrown by the decorations or the user function.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ unsafe - depends on the decorations construction/destruction.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.decorate"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_decorator_hpp.decorate" title="
+ Non Member Function decorate()">
+ Non Member Function <code class="computeroutput"><span class="identifier">decorate</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">decorate</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">Callable</span></code> is <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>. Copying <code class="computeroutput"><span class="identifier">f</span></code> shall have no side effects, and
+ the effect of calling the copy shall be equivalent to calling the
+ original.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Calls every declared decoration using the thread_decoration class.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ All the decorations have been called.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Any exception thrown by the decorations.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ unsafe - depends on the decorations construction/destruction.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp" title="
+ Header <boost/interthreads/thread_specific_shared_ptr.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_specific_shared_ptr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr">
+ Template Class <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code></a></span></dt></dl></div>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+
+ <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special">;</span>
+
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr" title="
+ Template Class thread_specific_shared_ptr<>">
+ Template Class <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_parameters">
+ Template parameters</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_types">
+ Public types</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_default_constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_constructor_with_custom_cleanup">
+ Cleanup Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_destructor">
+ Destructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_get">
+ Member Function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_arrow">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_star">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reset">
+ Member Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_wait_and_get">
+ Member Function <code class="computeroutput"><span class="identifier">wait_and_get</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operatora">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_mutex">
+ Member Function <code class="computeroutput"><span class="identifier">get_mutex</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_map">
+ Member Function <code class="computeroutput"><span class="identifier">get_map</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<p>
+ <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code>
+ is an extension of the thread_specific_ptr providing access to the thread
+ specific context from other threads.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">thread_specific_shared_ptr</span> <span class="special">:</span> <span class="keyword">private</span> <span class="identifier">noncopyable</span>
+<span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">typedef</span> <span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">shared_ptr_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="char">'implementation defined'</span> <span class="identifier">map_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="char">'implementation defined'</span> <span class="identifier">mutex_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="char">'implementation defined'</span> <span class="identifier">lock_type</span><span class="special">;</span>
+
+ <span class="identifier">thread_specific_shared_ptr</span><span class="special">();</span>
+ <span class="keyword">explicit</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_</span><span class="special">)(</span><span class="identifier">shared_ptr_type</span><span class="special">));</span>
+ <span class="special">~</span><span class="identifier">thread_specific_shared_ptr</span><span class="special">();</span>
+
+ <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">);</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">A</span> <span class="identifier">a</span><span class="special">);</span>
+
+ <span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">get_mutex</span><span class="special">();</span>
+ <span class="keyword">const</span> <span class="identifier">map_type</span><span class="special">&</span> <span class="identifier">get_map</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">shared_ptr_type</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="identifier">shared_ptr_type</span> <span class="identifier">wait_and_get</span><span class="special">(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="keyword">private</span><span class="special">:</span>
+ <span class="identifier">shared_ptr_type</span> <span class="identifier">get_shared_ptr</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_parameters"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_parameters" title="
+ Template parameters">
+ Template parameters</a>
+</h6></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> is instantiated with the following
+ types:
+ </p>
+<div class="itemizedlist"><ul type="disc"><li>
+ T The type of the pointeed object
+ </li></ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_types"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reference_types" title="
+ Public types">
+ Public types</a>
+</h6></div></div></div>
+<p>
+ <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> defines the following types:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+<span class="bold"><strong><code class="computeroutput"><span class="identifier">shared_ptr_type</span></code></strong></span>
+ The shared pointed type.
+ </li>
+<li>
+<span class="bold"><strong><code class="computeroutput"><span class="identifier">map_type</span></code></strong></span>
+ The mapping type from <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code>
+ to <code class="computeroutput"><span class="identifier">shared_ptr_type</span></code>
+</li>
+<li>
+<span class="bold"><strong><code class="computeroutput"><span class="identifier">mutex_type</span></code></strong></span>
+ The protecting mutext type follwing the Lockable Concept
+ </li>
+<li>
+<span class="bold"><strong><code class="computeroutput"><span class="identifier">lock_type</span></code></strong></span>
+ The lock used to get the map follwing the unique_lock subjacent Concept
+ </li>
+</ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_default_constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_default_constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">thread_specific_shared_ptr</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Construct a <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> object for storing a pointer
+ to an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ specific to each thread.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_constructor_with_custom_cleanup"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_constructor_with_custom_cleanup" title="
+ Cleanup Constructor">
+ Cleanup Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_</span><span class="special">)(</span><span class="identifier">shared_ptr_type</span><span class="special">));</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">cleanup_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code> does not throw any exceptions.
+ </p></dd>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Construct a <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> object for storing a pointer
+ to an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ specific to each thread. The supplied <code class="computeroutput"><span class="identifier">cleanup_function</span></code>
+ will be called at thread exit.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_destructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_specific_shared_ptr</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Remove from the static map the current thread::id and destroys
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Care needs to be taken to ensure that any threads still running after
+ an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> has been destroyed do not
+ call any member functions on that instance. Is for this raison that
+ usualy instance of this class are static.
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_get"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_get" title="
+ Member Function get()">
+ Member Function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">shared_ptr_type</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ The pointer associated with the current thread.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The initial value associated with an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> is <code class="computeroutput"><span class="number">0</span></code>
+ for each thread.
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_arrow"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_arrow" title="
+ Member Function operator->()">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code>
+ is not <code class="computeroutput"><span class="number">0</span></code>.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_star"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operator_star" title="
+ Member Function operator*()">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Requires:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code>
+ is not <code class="computeroutput"><span class="number">0</span></code>.
+ </p></dd>
+<dt><span class="term">Returns:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="special">*(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reset"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_reset" title="
+ Member Function reset()">
+ Member Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Equivalent to <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">().</span><span class="identifier">swap</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_shared_ptr</span><span class="special">())</span></code>. Update the mapping.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="number">0</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">new_value</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Equivalent to <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">(</span><span class="identifier">new_value</span><span class="special">).</span><span class="identifier">swap</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_shared_ptr</span><span class="special">())</span></code>. Update the mapping.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="identifier">new_value</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">new_value</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">deleter</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Equivalent to <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">(</span><span class="identifier">new_value</span><span class="special">,</span> <span class="identifier">deleter</span><span class="special">).</span><span class="identifier">swap</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_shared_ptr</span><span class="special">())</span></code>. Update the mapping.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="identifier">new_value</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">Y</span> <span class="special">*</span> <span class="identifier">new_value</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">deleter</span><span class="special">,</span> <span class="identifier">A</span> <span class="identifier">a</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Equivalent to <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">(</span><span class="identifier">new_value</span><span class="special">,</span> <span class="identifier">deleter</span><span class="special">,</span> <span class="identifier">a</span><span class="special">).</span><span class="identifier">swap</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_shared_ptr</span><span class="special">())</span></code>. Update the mapping.
+ </p></dd>
+<dt><span class="term">Postcondition:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="identifier">new_value</span></code>
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> when resources unavailable.
+ </p></dd>
+<dt><span class="term">Thread safety:</span></dt>
+<dd><p>
+ safe.
+ </p></dd>
+</dl>
+</div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ If <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()!=</span><span class="identifier">new_value</span></code> and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> is non-<code class="computeroutput"><span class="identifier">NULL</span></code>,
+ invoke <code class="computeroutput"><span class="keyword">delete</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">deleter</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code> as appropriate. Store <code class="computeroutput"><span class="identifier">new_value</span></code> as the pointer associated
+ with the current thread.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_wait_and_get"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_wait_and_get" title="
+ Member Function wait_and_get()">
+ Member Function <code class="computeroutput"><span class="identifier">wait_and_get</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">shared_ptr_type</span> <span class="identifier">wait_and_get</span><span class="special">(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Waits until the specific shared pointer has been set and returns
+ a shared pointer to this context.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current
+ thread of execution is interrupted.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operatora"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.thread_specific_shared_ptr_operatora" title="
+ Member Function operator[]()">
+ Member Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">shared_ptr_type</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Returns a copy of the specific shared_ptr of the thread of execution
+ identified by the <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_mutex"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_mutex" title="
+ Member Function get_mutex()">
+ Member Function <code class="computeroutput"><span class="identifier">get_mutex</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">get_mutex</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Returns a reference to the protection mutex.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_map"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.thread_specific_shared_ptr_hpp.thread_specific_shared_ptr_reference_thread_specific_shared_ptr.get_map" title="
+ Member Function get_map()">
+ Member Function <code class="computeroutput"><span class="identifier">get_map</span><span class="special">()</span></code></a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">map_type</span><span class="special">&</span> <span class="identifier">get_map</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&)</span> <span class="keyword">const</span><span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Returns a reference to the mapping from <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code>
+ to the specific pointers provided the user gives a lock on the
+ motext get using <code class="computeroutput"><span class="identifier">get_mutex</span><span class="special">()</span></code>.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing.
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp" title="
+ Header <boost/interthreads/thread_keep_alive.hpp>">
+ Header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">thread_keep_alive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">enable_keep_alive</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">disable_keep_alive</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_check_point">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_check_point</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_enabled">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_enabled</span><span class="special">()</span></code></a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_set_on_dead_thread">
+ Non Member Function <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code></a></span></dt>
+</dl></div>
+<p>
+ Includes the keep alive enabling/disabling classes and non member functions.
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+ <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span>
+ <span class="keyword">class</span> <span class="identifier">enable_keep_alive</span><span class="special">;</span>
+ <span class="keyword">class</span> <span class="identifier">disable_keep_alive</span><span class="special">;</span>
+
+ <span class="keyword">void</span> <span class="identifier">keep_alive_check_point</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">keep_alive_enabled</span><span class="special">();</span>
+ <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="special">(*</span><span class="identifier">on_dead_thread_type</span><span class="special">)(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive" title="
+ class enable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">enable_keep_alive</span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Destructor">
+ Destructor</a></span></dt>
+</dl></div>
+<p>
+ Keep alive enabler.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">enable_keep_alive</span> <span class="special">:</span> <span class="keyword">private</span> <span class="identifier">noncopyable</span><span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">enable_keep_alive</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">threshold</span><span class="special">=</span><span class="number">2</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">tap</span><span class="special">=</span><span class="number">1</span><span class="special">);</span>
+ <span class="special">~</span><span class="identifier">enable_keep_alive</span><span class="special">();</span>
+<span class="special">};</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">enable_keep_alive</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">threshold</span><span class="special">=</span><span class="number">2</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">tap</span><span class="special">=</span><span class="number">1</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Enable the keep alive mechanism on this thread of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Destructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.enable_keep_alive.keep_alive_enable_keep_alive_Destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">enable_keep_alive</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Restore the keep alive mechanism as it was before the constructor.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive" title="
+ class disable_keep_alive">
+ class <code class="computeroutput"><span class="identifier">disable_keep_alive</span></code></a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Constructor">
+ Constructor</a></span></dt>
+<dt><span class="section"><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Destructor">
+ Destructor</a></span></dt>
+</dl></div>
+<p>
+ Keep alive disabler.
+ </p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">disable_keep_alive</span> <span class="keyword">private</span> <span class="identifier">noncopyable</span> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">disable_keep_alive</span><span class="special">();</span>
+ <span class="special">~</span><span class="identifier">disable_keep_alive</span><span class="special">();</span>
+<span class="special">};</span>
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Constructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Constructor" title="
+ Constructor">
+ Constructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="identifier">disable_keep_alive</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Disable the keep alive mechanism on this thread of execution.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Destructor"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_disable_keep_alive.keep_alive_disable_keep_alive_Destructor" title="
+ Destructor">
+ Destructor</a>
+</h6></div></div></div>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">disable_keep_alive</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Restore the keep alive mechanism as it was before the constructor.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_check_point"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_check_point" title="
+ Non Member Function keep_alive_check_point()">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_check_point</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<p>
+ Keep alive check point.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">keep_alive_check_point</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ States that the current thread is alive.
+ </p></dd>
+<dt><span class="term">Postconditions:</span></dt>
+<dd><p>
+ The thread is alive.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_enabled"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_enabled" title="
+ Non Member Function keep_alive_enabled()">
+ Non Member Function <code class="computeroutput"><span class="identifier">keep_alive_enabled</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<p>
+ Keep alive query.
+ </p>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">keep_alive_enabled</span><span class="special">();</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ States if the keep alive mechanism is enabled on this thread.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_set_on_dead_thread"></a><a href="thread_extensions_reference.html#toward_boost_interthreads.reference.thread_extensions_reference.keep_alive_file_hpp.keep_alive_keep_alive_set_on_dead_thread" title="
+ Non Member Function set_on_dead_thread()">
+ Non Member Function <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code></a>
+</h5></div></div></div>
+<p>
+ Keep alive on dead thread action setting.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">);</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Effects:</span></dt>
+<dd><p>
+ Modifies the action to be done when a this thread is declared dead.
+ </p></dd>
+<dt><span class="term">Throws:</span></dt>
+<dd><p>
+ Nothing
+ </p></dd>
+</dl>
+</div>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="concepts.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="thread_array_reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,67 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Users'Guide</title>
+<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../index.html" title="Toward Boost.InterThreads">
+<link rel="prev" href="overview/motivation.html" title=" Motivation">
+<link rel="next" href="users_guide/getting_started.html" title="
+ Getting Started">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="overview/motivation.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="users_guide/getting_started.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="toward_boost_interthreads.users_guide"></a> Users'Guide
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="users_guide/getting_started.html">
+ Getting Started</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="users_guide/getting_started.html#toward_boost_interthreads.users_guide.getting_started.install">
+ Installing InterThreads</a></span></dt>
+<dt><span class="section"><a href="users_guide/getting_started.html#toward_boost_interthreads.users_guide.getting_started.hello_world__decorator">Hello
+ World! decorator</a></span></dt>
+<dt><span class="section"><a href="users_guide/getting_started.html#toward_boost_interthreads.users_guide.getting_started.monotonic_thread_id">Monotonic
+ Thread Id</a></span></dt>
+<dt><span class="section"><a href="users_guide/getting_started.html#toward_boost_interthreads.users_guide.getting_started.basic_keep_alive">Basic
+ keep alive</a></span></dt>
+</dl></dd>
+<dt><span class="section"> Tutorial</span></dt>
+<dd><dl><dt><span class="section"><a href="users_guide/tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions">Thread
+ Extensions</a></span></dt></dl></dd>
+<dt><span class="section"><a href="users_guide/bibliography.html">
+ References</a></span></dt>
+<dt><span class="section"> Glossary</span></dt>
+</dl></div>
+<p>
+ [/
+ </p>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="overview/motivation.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="users_guide/getting_started.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/bibliography.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/bibliography.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+ References</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../users_guide.html" title=" Users'Guide">
+<link rel="prev" href="tutorial.html" title=" Tutorial">
+<link rel="next" href="glosary.html" title=" Glossary">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tutorial.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="glosary.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.users_guide.bibliography"></a><a href="bibliography.html" title="
+ References">
+ References</a>
+</h3></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><a href="http://www.boost.org/libs/thread" target="_top">Boost.Thread
+ (A. Williams)</a></span></dt>
+<dd><p>
+ </p></dd>
+</dl>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tutorial.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="glosary.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/getting_started.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/getting_started.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,389 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+ Getting Started</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../users_guide.html" title=" Users'Guide">
+<link rel="prev" href="../users_guide.html" title=" Users'Guide">
+<link rel="next" href="tutorial.html" title=" Tutorial">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../users_guide.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.users_guide.getting_started"></a><a href="getting_started.html" title="
+ Getting Started">
+ Getting Started</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install">
+ Installing InterThreads</a></span></dt>
+<dt><span class="section"><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.hello_world__decorator">Hello
+ World! decorator</a></span></dt>
+<dt><span class="section"><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.monotonic_thread_id">Monotonic
+ Thread Id</a></span></dt>
+<dt><span class="section"><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.basic_keep_alive">Basic
+ keep alive</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.users_guide.getting_started.install"></a><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install" title="
+ Installing InterThreads">
+ Installing InterThreads</a>
+</h4></div></div></div>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.getting_boost_interthreads"></a><h5>
+<a name="id4759283"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.getting_boost_interthreads">Getting
+ Boost.InterThreads</a>
+ </h5>
+<p>
+ You can get the last stable release of <span class="bold"><strong>Boost.InterThreads</strong></span>
+ by downloading <code class="literal">interthreads.zip</code> from the <a href="http://www.boost-consulting.com/vault/index.php?directory=Concurrent%20Programming" target="_top">Boost
+ Vault</a>
+ </p>
+<p>
+ You can also access the latest (unstable?) state from the <a href="https://svn.boost.org/svn/boost/sandbox/interthreads" target="_top">Boost
+ Sandbox</a>.
+ </p>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.building_boost_interthreads"></a><h5>
+<a name="id4759339"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.building_boost_interthreads">Building
+ Boost.InterThreads</a>
+ </h5>
+<p>
+ <span class="bold"><strong>Boost.InterThreads</strong></span> is not a header only
+ library. You need to compile it before use.
+ </p>
+<pre class="programlisting"><span class="identifier">cd</span> <span class="identifier">libs</span><span class="special">/</span><span class="identifier">interthreads</span><span class="special">/</span><span class="identifier">build</span>
+<span class="identifier">bjam</span>
+</pre>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.build_requirements"></a><h5>
+<a name="id4759412"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.build_requirements">Build
+ Requirements</a>
+ </h5>
+<p>
+ <span class="bold"><strong>Boost.InterThreads</strong></span> depends on Boost. You
+ must use either Boost version 1.38.x or the version in SVN trunk. In particular,
+ <span class="bold"><strong>Boost.InterThreads</strong></span> depends on:
+ </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">Boost.Array</span></dt>
+<dd><p>
+ for array, ...
+ </p></dd>
+<dt><span class="term">Boost.Bind</span></dt>
+<dd><p>
+ for bind, ...
+ </p></dd>
+<dt><span class="term">Boost.Config</span></dt>
+<dd><p>
+ for ??? and abi_prefic_sufix, ...
+ </p></dd>
+<dt><span class="term">Boost.Function</span></dt>
+<dd><p>
+ for function, ...
+ </p></dd>
+<dt><span class="term">Boost.Fusion</span></dt>
+<dd><p>
+ for tuples, and sequence algorithms ...
+ </p></dd>
+<dt><span class="term">Boost.MPL</span></dt>
+<dd><p>
+ for transform, ...
+ </p></dd>
+<dt><span class="term">Boost.Preprocesor</span></dt>
+<dd><p>
+ to simulate variadic templates , ...
+ </p></dd>
+<dt><span class="term">Boost.SmartPtr</span></dt>
+<dd><p>
+ for shared_ptr, ...
+ </p></dd>
+<dt><span class="term">Boost.Threads</span></dt>
+<dd><p>
+ for thread, thread_specific_ptr, call_once, mutex, condition_variable,
+ ...
+ </p></dd>
+<dt><span class="term">Boost.TypeOf</span></dt>
+<dd><p>
+ to register the ACT types.
+ </p></dd>
+<dt><span class="term">Boost.TypeTrais</span></dt>
+<dd><p>
+ for is_void, remove_references, ...
+ </p></dd>
+<dt><span class="term">Boost.Utility</span></dt>
+<dd><p>
+ for result_of, enable_if...
+ </p></dd>
+</dl>
+</div>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.exceptions_safety"></a><h5>
+<a name="id4759694"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.exceptions_safety">Exceptions
+ safety</a>
+ </h5>
+<p>
+ All functions in the library are exception-neutral and provide strong guarantee
+ of exception safety as long as the underlying parameters provide it.
+ </p>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.thread_safety"></a><h5>
+<a name="id4759722"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.thread_safety">Thread
+ safety</a>
+ </h5>
+<p>
+ All functions in the library are thread-unsafe except when noted explicitly.
+ </p>
+<a name="toward_boost_interthreads.users_guide.getting_started.install.tested_compilers"></a><h5>
+<a name="id4759749"></a>
+ <a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.install.tested_compilers">Tested
+ compilers</a>
+ </h5>
+<p>
+ Currently, <span class="bold"><strong>Boost.InterThreads</strong></span> has been
+ tested in the following compilers/platforms:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ GCC 3.4.4 Cygwin
+ </li>
+<li>
+ GCC 3.4.6 Linux
+ </li>
+<li>
+ GCC 4.1.2 Linux
+ </li>
+</ul></div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Please send any questions, comments and bug reports to boost <at>
+ lists <dot> boost <dot> org.
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.users_guide.getting_started.hello_world__decorator"></a><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.hello_world__decorator" title="Hello
+ World! decorator">Hello
+ World! decorator</a>
+</h4></div></div></div>
+<p>
+ This is a little bit more than a Hello World! example. It will also say
+ Bye, Bye!
+ </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">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</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">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">iostream</span><span class="special">></span>
+
+<span class="keyword">namespace</span> <span class="identifier">bith</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">;</span>
+
+<span class="keyword">void</span> <span class="identifier">my_setup</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Hello World!"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">my_cleanup</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Bye, Bye!"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">my_decoration</span><span class="special">(</span><span class="identifier">my_setup</span><span class="special">,</span> <span class="identifier">my_cleanup</span><span class="special">);</span>
+
+<span class="keyword">void</span> <span class="identifier">my_thread</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"..."</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</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="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_decorator</span><span class="special">(</span><span class="identifier">my_thread</span><span class="special">));</span>
+ <span class="identifier">th</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ When <code class="computeroutput"><span class="identifier">th</span></code> is created with
+ the <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decorator</span></code> wrapper, it will initialize
+ all the decorations before calling <code class="computeroutput"><span class="identifier">my_thread</span></code>.
+ This <code class="computeroutput"><span class="identifier">my_cleanup</span></code> will be
+ registered with the <code class="computeroutput"><span class="identifier">boost</span><span class="special">:</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">at_thread_exit</span></code>
+ if the <code class="computeroutput"><span class="identifier">my_setup</span></code> function
+ succeeds i.e. does not throw. Then the thread function <code class="computeroutput"><span class="identifier">my_thread</span></code>
+ is called. At the thread exit, the <code class="computeroutput"><span class="identifier">my_cleanup</span></code>
+ function is called. This results on the following output
+ </p>
+<pre class="programlisting">Hello World!
+...
+Bye, Bye!
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.users_guide.getting_started.monotonic_thread_id"></a><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.monotonic_thread_id" title="Monotonic
+ Thread Id">Monotonic
+ Thread Id</a>
+</h4></div></div></div>
+<p>
+ This example use thread decorator and thread specific pointers to implement
+ a monotonic thread identifier.
+ </p>
+<p>
+ The monotonic thread identifier is managed by the mono_thread_id class.
+ There is a mutex protecting the access to the monotonic counter. The main
+ difference between a thread_specific_shared_ptr and a thread_specific_ptr
+ is that we can get the specific pointer of another thread (*) With the
+ help of bith::thread_decoration, the setting of the thread specific shared
+ pointer is done transparently, as far as the thread is created using a
+ thread decorator. This setup function resets the specific pointer with
+ the value of the monotonic counter which will be self increased.
+ </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">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</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">interthreads</span><span class="special">/</span><span class="identifier">thread_specific_shared_ptr</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">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">iostream</span><span class="special">></span>
+
+<span class="keyword">namespace</span> <span class="identifier">bith</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">;</span>
+
+<span class="keyword">class</span> <span class="identifier">mono_thread_id</span> <span class="special">{</span>
+ <span class="keyword">static</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">decoration_</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="keyword">unsigned</span><span class="special">></span> <span class="identifier">tssp_type</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">tssp_type</span> <span class="identifier">current_</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">counter_</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">sync_</span><span class="special">;</span>
+
+ <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">create</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">sync_</span><span class="special">);</span>
+ <span class="keyword">unsigned</span> <span class="identifier">res</span> <span class="special">=</span> <span class="identifier">counter_</span><span class="special">;</span>
+ <span class="special">++</span><span class="identifier">counter</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">res</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">setup</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">current_</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">unsigned</span><span class="special">(</span><span class="identifier">create</span><span class="special">());</span>
+ <span class="special">}</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">id</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="identifier">current_</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">id</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">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="identifier">current_</span><span class="special">[</span><span class="identifier">id</span><span class="special">];</span> <span class="comment">// (*)
+</span> <span class="special">}</span>
+
+<span class="special">};</span>
+
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">decoration</span><span class="special">(</span><span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">setup</span><span class="special">);</span>
+<span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">tssp_type</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">current_</span><span class="special">;</span>
+<span class="keyword">unsigned</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">counter_</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">mutex</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">sync_</span><span class="special">;</span>
+</pre>
+<p>
+ In this way the applications using the thread_decorator can have access
+ to a monotonic thread id mono_thread_id::id() and this id is accesible
+ to other threads providing the boost::thread::id.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">my_thread</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"mono_thread_id="</span> <span class="special"><<</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="identifier">sleep</span><span class="special">(</span><span class="number">5</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">struct</span> <span class="identifier">mono_thread_id_out</span> <span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"thread::id="</span> <span class="special"><<</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span>
+ <span class="special"><<</span> <span class="string">" mono_thread_id="</span> <span class="special"><<</span> <span class="identifier">mono_thread_id</span><span class="special">::</span><span class="identifier">id</span><span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">())</span>
+ <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</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="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">shared_threader_decorator</span> <span class="identifier">ae</span><span class="special">;</span>
+ <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">handles</span><span class="special">,</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">fork_all</span><span class="special">(</span><span class="identifier">basic_threader_decorator</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">));</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fusion</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">handles</span><span class="special">,</span> <span class="identifier">mono_thread_id_out</span><span class="special">());</span>
+ <span class="identifier">bith</span><span class="special">.</span><span class="identifier">join_all</span><span class="special">();</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ This results on the following output
+ </p>
+<pre class="programlisting">mono_thread_id=1
+mono_thread_id=2
+thread::id=xxxx mono_thread_id=1
+thread::id=xxxx mono_thread_id=2
+
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.users_guide.getting_started.basic_keep_alive"></a><a href="getting_started.html#toward_boost_interthreads.users_guide.getting_started.basic_keep_alive" title="Basic
+ keep alive">Basic
+ keep alive</a>
+</h4></div></div></div>
+<p>
+ This example shows the keep_alive basics.
+ </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">interthreads</span><span class="special">/</span><span class="identifier">thread_decorator</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">interthreads</span><span class="special">/</span><span class="identifier">keep_alive</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">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">iostream</span><span class="special">></span>
+
+<span class="keyword">namespace</span> <span class="identifier">bith</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">;</span>
+
+<span class="keyword">void</span> <span class="identifier">my_thread</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">enable_keep_alive</span> <span class="identifier">enabler</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="number">5</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span> <span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">keep_alive_point</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"thread_id="</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="identifier">sleep</span><span class="special">(</span><span class="number">1</span><span class="special">);</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="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">shared_threader_decorator</span> <span class="identifier">ae</span><span class="special">;</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">ae</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">,</span> <span class="identifier">my_thread</span><span class="special">);</span>
+
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The user creates 4 threads using the shared_threader_decorator <code class="computeroutput"><span class="identifier">AsynchronousExecutor</span></code> to be able to use
+ the keep_alive mechanism. It uses the default enabler (one keep_alive_point
+ every 2 seconds).
+ </p>
+<p>
+ This results on the following output
+ </p>
+<pre class="programlisting"></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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../users_guide.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/glosary.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/glosary.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,91 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Glossary</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../users_guide.html" title=" Users'Guide">
+<link rel="prev" href="bibliography.html" title="
+ References">
+<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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="bibliography.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.users_guide.glosary"></a> Glossary
+</h3></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">alive (thread)</span></dt>
+<dd><p>
+ a thread is considered alive when not dead.
+ </p></dd>
+<dt><span class="term">cleanup decoration</span></dt>
+<dd><p>
+ function called at thread exit.
+ </p></dd>
+<dt><span class="term">dead (thread)</span></dt>
+<dd><p>
+ a thread is considered dead when has not done enough keep alive check
+ points for a given duration.
+ </p></dd>
+<dt><span class="term">decoration</span></dt>
+<dd><p>
+ Couple of setup/cleanup thread decorating functions.
+ </p></dd>
+<dt><span class="term">decorator</span></dt>
+<dd><p>
+ Functor wrapper decorating a thread with all the setups and cleanups
+ decorations.
+ </p></dd>
+<dt><span class="term">deleter TSSS</span></dt>
+<dd><p>
+ specific function used to delete the TSSS.
+ </p></dd>
+<dt><span class="term">KA</span></dt>
+<dd><p>
+ Keep Alive.
+ </p></dd>
+<dt><span class="term">setup decoration</span></dt>
+<dd><p>
+ function called before the thread starts.
+ </p></dd>
+<dt><span class="term">TSS</span></dt>
+<dd><p>
+ Thread Specific Storage.
+ </p></dd>
+<dt><span class="term">TSSS</span></dt>
+<dd><p>
+ Thread Specific Shared Storage.
+ </p></dd>
+</dl>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="bibliography.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/tutorial.html
==============================================================================
--- (empty file)
+++ sandbox/interthreads/libs/interthreads/doc/html/toward_boost_interthreads/users_guide/tutorial.html 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,1019 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Tutorial</title>
+<link rel="stylesheet" href="../../../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Toward Boost.InterThreads">
+<link rel="up" href="../users_guide.html" title=" Users'Guide">
+<link rel="prev" href="getting_started.html" title="
+ Getting Started">
+<link rel="next" href="bibliography.html" title="
+ References">
+</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">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="getting_started.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial"></a> Tutorial
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions">Thread
+ Extensions</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer">Thread
+ Specific Shared Pointer</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive">Keep
+ alive</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></dd>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions" title="Thread
+ Extensions">Thread
+ Extensions</a>
+</h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator">Thread
+ Decorator</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer">Thread
+ Specific Shared Pointer</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive">Keep
+ alive</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple">Thread
+ Tuple</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator" title="Thread
+ Decorator">Thread
+ Decorator</a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.declaring_a_decoration">Declaring
+ a decoration</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.creating_threads_with_decorators">Creating
+ threads with decorators</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.decorator_explicit_call">
+ Calling explictly the decoration on a thread</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.declaring_a_decoration"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.declaring_a_decoration" title="Declaring
+ a decoration">Declaring
+ a decoration</a>
+</h6></div></div></div>
+<p>
+ Objects of type <code class="computeroutput"><span class="identifier">thread_decoration</span></code>
+ are usualy static and initialized with a <code class="computeroutput"><span class="identifier">Callable</span></code>
+ object:
+ </p>
+<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">interthreads</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">d</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">setup</span><span class="special">();</span>
+
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">d</span><span class="special">(</span><span class="identifier">setup</span><span class="special">);</span>
+</pre>
+<p>
+ These decorations will be called either when we request this explicitly
+ at the initialization of the thread (this is needed on the main thread)
+ or when we create a thread using specific decorator wrapper. This is
+ explained in more detail in the next sections.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.creating_threads_with_decorators"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.creating_threads_with_decorators" title="Creating
+ threads with decorators">Creating
+ threads with decorators</a>
+</h6></div></div></div>
+<p>
+ When we want the decorations to decorate one thread of execution we
+ can create the thread using the decorator wrapper.
+ </p>
+<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decorator</span><span class="special">(</span><span class="identifier">fct</span><span class="special">));</span>
+</pre>
+<p>
+ or using one of the <code class="computeroutput"><span class="identifier">AsynchronousExecutor</span></code>
+ decorators, as
+ </p>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">basic_threader_decorator</span> <span class="identifier">ae</span><span class="special">;</span>
+<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">th</span><span class="special">,</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">fork</span><span class="special">(</span><span class="identifier">ae</span><span class="special">,</span> <span class="identifier">fct</span><span class="special">));</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.decorator_explicit_call"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_decorator.decorator_explicit_call" title="
+ Calling explictly the decoration on a thread">
+ Calling explictly the decoration on a thread</a>
+</h6></div></div></div>
+<p>
+ For threads that are not created using the boost::thread class, as
+ it is the case of the main thread, we need to call explicitly the function
+ <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span></code> at the begining of the thread.
+ </p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span><span class="special">();</span>
+ <span class="comment">// ...
+</span><span class="special">}</span>
+</pre>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer" title="Thread
+ Specific Shared Pointer">Thread
+ Specific Shared Pointer</a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.key_initialization">Key
+ initialization</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.context_initialization">Context
+ initialization</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_on_the_current_thread">Obtain
+ the pointer to the thread-specific object on the current thread</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_of_another_thread">Obtain
+ the pointer to the thread-specific object of another thread</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.iterating_through_all_the_thread_specific_context">Iterating
+ through all the thread specific context</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.deleting_the_context">Deleting
+ the context</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.cleanup_at_thread_exit">Cleanup
+ at thread exit</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.key_initialization"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.key_initialization" title="Key
+ initialization">Key
+ initialization</a>
+</h6></div></div></div>
+<p>
+ As the curent implementation uses the address of the thread_specific_shared_ptr<>
+ object, there is no need to do anything to get the key.
+ </p>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">ptr</span><span class="special">;</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.context_initialization"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.context_initialization" title="Context
+ initialization">Context
+ initialization</a>
+</h6></div></div></div>
+<p>
+ Initially the pointer has a value of <code class="computeroutput"><span class="number">0</span></code>
+ in each thread, but the value for the current thread can be set using
+ the <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code>
+ member functions.
+ </p>
+<p>
+ If the value of the pointer for the current thread is changed using
+ <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code>,
+ then the previous value is destroyed by calling the deleter routine.
+ Alternatively, the stored value can be reset to <code class="computeroutput"><span class="number">0</span></code>
+ and the prior value returned by calling the <code class="computeroutput"><span class="identifier">release</span><span class="special">()</span></code> member function, allowing the application
+ to take back responsibility for destroying the object.
+ </p>
+<p>
+ Initialization can be done
+ </p>
+<div class="itemizedlist"><ul type="disc"><li>
+ explicitly on the curret thread. Basically it works like a thread
+ local storage from inside the thread.
+ </li></ul></div>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">ptr</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">func</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// current thread
+</span> <span class="comment">// ...
+</span> <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span>
+ <span class="comment">// ...
+</span><span class="special">}</span>
+</pre>
+<div class="itemizedlist"><ul type="disc"><li>
+ When we associate a thread decoration to the thread_specific_shared_ptr<>
+ we initialize implicitly every thread created with a thread_decorator.
+ </li></ul></div>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">ptr</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">myclass_setup</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">myclass</span><span class="special">(</span><span class="identifier">any</span> <span class="identifier">specific</span> <span class="identifier">parameters</span><span class="special">));</span>
+<span class="special">}</span>
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decoration</span> <span class="identifier">myclass_decoration</span><span class="special">(</span><span class="identifier">myclass_setup</span><span class="special">);</span>
+
+<span class="keyword">void</span> <span class="identifier">func</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// ptr.reset(p); done implicitly
+</span>
+<span class="special">}</span>
+
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">=</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_decorated_thread</span><span class="special">(</span><span class="identifier">func</span><span class="special">);</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_on_the_current_thread"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_on_the_current_thread" title="Obtain
+ the pointer to the thread-specific object on the current thread">Obtain
+ the pointer to the thread-specific object on the current thread</a>
+</h6></div></div></div>
+<p>
+ All functions known from boost::thread_specific_ptr are available except
+ the release function. The value for the current thread can be obtained
+ using the <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
+ member function, or by using the <code class="computeroutput"><span class="special">*</span></code>
+ and <code class="computeroutput"><span class="special">-></span></code> pointer deference
+ operators.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">func</span><span class="special">()</span> <span class="special">{</span>
+<span class="special">{</span> <span class="comment">// current thread
+</span> <span class="comment">// ...
+</span> <span class="keyword">if</span> <span class="special">(</span><span class="identifier">ptr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">0</span><span class="special">)</span> <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">myclass</span><span class="special">);</span>
+ <span class="comment">// ...
+</span> <span class="identifier">ptr</span><span class="special">-></span><span class="identifier">someFct</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_of_another_thread"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.obtain_the_pointer_to_the_thread_specific_object_of_another_thread" title="Obtain
+ the pointer to the thread-specific object of another thread">Obtain
+ the pointer to the thread-specific object of another thread</a>
+</h6></div></div></div>
+<p>
+ Besides, other threads can get access to the data provided a thread::id
+ by:
+ </p>
+<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">=</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_decorated_thread</span><span class="special">(</span><span class="identifier">func</span><span class="special">);</span>
+
+<span class="identifier">ptr</span><span class="special">[</span><span class="identifier">th</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()]-></span><span class="identifier">foo</span><span class="special">();</span>
+</pre>
+<p>
+ where <code class="computeroutput"><span class="identifier">foo</span><span class="special">()</span></code>
+ is a function of <code class="computeroutput"><span class="identifier">myclass</span></code>.
+ </p>
+<p>
+ This could work or not. The issue appears as we can get a reference
+ to a thread before the thread has started, so the setting of the thread
+ specific context could be not yet done. One way to manage with this
+ error is to get the shared pointer and check if it contains something
+ or not.
+ </p>
+<pre class="programlisting"><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">shp</span> <span class="special">=</span> <span class="identifier">ptr</span><span class="special">[</span><span class="identifier">th</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()]-></span><span class="identifier">foo</span><span class="special">();</span>
+<span class="keyword">if</span> <span class="special">(</span><span class="identifier">shp</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">!=</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">shp</span><span class="special">-></span><span class="identifier">foo</span><span class="special">();</span>
+<span class="keyword">else</span> <span class="special">...</span>
+</pre>
+<p>
+ When we need this we can pool:
+ </p>
+<pre class="programlisting"><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">shp</span><span class="special">;</span>
+<span class="keyword">do</span> <span class="special">{</span>
+ <span class="identifier">shp</span> <span class="special">=</span> <span class="identifier">ptr</span><span class="special">[</span><span class="identifier">th</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()]-></span><span class="identifier">foo</span><span class="special">();</span>
+<span class="special">}</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">shp</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+<span class="identifier">shp</span><span class="special">-></span><span class="identifier">foo</span><span class="special">();</span>
+</pre>
+<p>
+ The library provides a synchonization mechanism to solve this issue.
+ The wait_and_get() function allows a thread to synchronize with the
+ setting from another thread.
+ </p>
+<pre class="programlisting"><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">></span> <span class="identifier">shp</span> <span class="special">=</span> <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">wait_and_get</span><span class="special">(</span><span class="identifier">th</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">());</span>
+<span class="identifier">shp</span><span class="special">-></span><span class="identifier">foo</span><span class="special">();</span>
+</pre>
+<p>
+ shared_ptr<myclass> shp = ptr.wait_and_get(th->get_id());
+ shp->foo(); or
+ </p>
+<pre class="programlisting"><span class="identifier">ptr</span><span class="special">.</span><span class="identifier">wait_and_get</span><span class="special">(</span><span class="identifier">th</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()-></span><span class="identifier">foo</span><span class="special">();</span>
+</pre>
+<p>
+ In order to ensure that the decorations have been called, a cleaner
+ and safer option is not to return the thread until it has been started.
+ This behavior is obtained each time the thread is created with an
+ <code class="computeroutput"><span class="identifier">AsynchronousExecutor</span></code>
+ decorator, as
+ </p>
+<pre class="programlisting"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">basic_threader_decorator</span> <span class="identifier">ae</span><span class="special">;</span>
+<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">th</span><span class="special">,</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">fork</span><span class="special">(</span><span class="identifier">ae</span><span class="special">,</span> <span class="identifier">func</span><span class="special">));</span>
+<span class="comment">// here you are sure all the decorations have been called
+</span><span class="comment">// so we can access any thread_specific_shared_ptr of the created thread.
+</span></pre>
+<p>
+ The lifetime of the myclass instance is managed by a shared_ptr. One
+ reference is held by the thread (by means of a tss), a second is held
+ by the thread::id to shared_ptr<T> map and additional references
+ might be held by other threads, obtained by <code class="computeroutput"><span class="special">*</span><span class="identifier">pmyclass</span><span class="special">[</span><span class="identifier">th</span><span class="special">]</span></code>.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.iterating_through_all_the_thread_specific_context"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.iterating_through_all_the_thread_specific_context" title="Iterating
+ through all the thread specific context">Iterating
+ through all the thread specific context</a>
+</h6></div></div></div>
+<p>
+ Another use case appears when some global controller needs to access
+ the thread specific data of all the threads. Several approaches are
+ here possible; the library has choosen to provide a map getter using
+ a external locking mechanism that 'ensure' that the map access is locked
+ during the map query.
+ </p>
+<pre class="programlisting"><span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">>::</span><span class="identifier">lock_type</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">ptr</span><span class="special">.</span><span class="identifier">get_mutex</span><span class="special">());</span>
+ <span class="keyword">const</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">myclass</span><span class="special">>::</span><span class="identifier">map_type</span> <span class="identifier">amap</span> <span class="special">=</span> <span class="identifier">ptr</span><span class="special">.</span><span class="identifier">get_map</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
+ <span class="comment">// use the map
+</span><span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.deleting_the_context"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.deleting_the_context" title="Deleting
+ the context">Deleting
+ the context</a>
+</h6></div></div></div>
+<p>
+ When a thread exits, the objects associated with each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code>
+ instance is not inmediately destroyed due to its shared nature. It
+ is detached from the current thread and removed from the map. Only
+ when there are no more references to the shared pointer it will be
+ destroyed. By default, the object pointed to by a pointer <code class="computeroutput"><span class="identifier">p</span></code> is destroyed by invoking <code class="computeroutput"><span class="keyword">delete</span> <span class="identifier">p</span></code>,
+ but this can be overridden for a specific instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code>
+ by providing a deleter routine to the constructor. In this case, the
+ object is destroyed by invoking <code class="computeroutput"><span class="identifier">deleter</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">deleter</span></code>
+ is the deleter routine supplied to the constructor. The deleter function
+ is called only when there are no more references to the shared pointer.
+ </p>
+<pre class="programlisting"><span class="comment">// Add use of deleter !!!
+</span></pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.cleanup_at_thread_exit"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_specific_shared_pointer.cleanup_at_thread_exit" title="Cleanup
+ at thread exit">Cleanup
+ at thread exit</a>
+</h6></div></div></div>
+<p>
+ When a thread exits, the objects associated with each thread_specific_shared_ptr<>
+ instance is not inmediately destroyed due to its shared nature. Only
+ when there are no more references to the shared pointer it will be
+ destroyed. By default, the object pointed to by a pointer p is destroyed
+ by invoking delete p, but this can be overridden for a specific instance
+ of boost::thread_specific_shared_ptr<> by providing a cleanup
+ routine to the constructor. In this case, the object is destroyed by
+ invoking func(p) where func is the cleanup routine supplied to the
+ constructor. The cleanup functions are called in an unspecified order.
+ If a cleanup routine sets the value of associated with an instance
+ of boost::thread_specific_shared_ptr<> that has already been
+ cleaned up, that value is added to the cleanup list. Cleanup finishes
+ when there are no outstanding instances of boost::thread_specific_shared_ptr<>
+ with values. If a cleanup routine sets the value associated with an
+ instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code>
+ that has already been cleaned up, that value is added to the cleanup
+ list. Cleanup finishes when there are no outstanding instances of
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code>
+ with values.
+ </p>
+<pre class="programlisting"><span class="comment">// Add use of at thread_exit!!!
+</span></pre>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive" title="Keep
+ alive">Keep
+ alive</a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Interface</span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_mechanism_initialization">Keep
+ alive mechanism initialization</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_threads">
+ Which threads can be controlled?</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_enabling">
+ Enabling the keep alive mechanism</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_disabling">
+ Disabling the keep alive mechanism</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_persistent">
+ Configuring the dead persistency</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from_the_current_thread">Access
+ from the current thread</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from__the_controller_thread">Access
+ from the controller thread</a></span></dt>
+</dl></div>
+<p>
+ We will use the implementation of the keep alive mechanism as tutorial
+ for the thread decorators, thread specific shared pointers and the keep
+ alive mechanism itself.
+ </p>
+<p>
+ We want to detect situations on which a thread is looping or blocked
+ on some component. The user needs to state when this mechanism is enabled
+ or disabled.
+ </p>
+<p>
+ Since the only purpose is to find threads that don't work, the thread
+ needs to say if it is alive to a controller. The controler requests at
+ predefined intervals if the thread is dead, and in this case it will
+ call a user specific function which by default aborts the program.
+ </p>
+<p>
+ A thread is considered dead if during a given period the number of checkins
+ is inferior to a given threshold. These two parameters are given when
+ the keep alive mechanislm is enabled. At the begining of a thread the
+ keep alive mechanism is disabled.
+ </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.interface"></a>Interface
+</h6></div></div></div>
+<p>
+ Next follows the keep alive interface.
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+<span class="keyword">namespace</span> <span class="identifier">interthreads</span> <span class="special">{</span>
+ <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span>
+ <span class="keyword">class</span> <span class="identifier">enable_keep_alive</span> <span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">enable_keep_alive</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">periods</span><span class="special">=</span><span class="number">2</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">checkins</span><span class="special">=</span><span class="number">1</span><span class="special">);</span>
+ <span class="special">~</span><span class="identifier">enable_keep_alive</span><span class="special">();</span>
+ <span class="special">};</span>
+
+ <span class="keyword">class</span> <span class="identifier">disable_keep_alive</span> <span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">disable_keep_alive</span><span class="special">();</span>
+ <span class="special">~</span><span class="identifier">disable_keep_alive</span><span class="special">();</span>
+ <span class="special">};</span>
+
+ <span class="keyword">void</span> <span class="identifier">keep_alive_point</span><span class="special">();</span>
+ <span class="keyword">bool</span> <span class="identifier">keep_alive_enabled</span><span class="special">();</span>
+
+ <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="special">(*</span><span class="identifier">on_dead_thread_type</span><span class="special">)(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">,</span> <span class="identifier">thread</span><span class="special">*);</span>
+ <span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">,</span> <span class="identifier">thread</span><span class="special">*</span> <span class="identifier">th</span><span class="special">=</span><span class="number">0</span><span class="special">);</span>
+
+ <span class="special">}</span>
+ <span class="keyword">bool</span> <span class="identifier">keep_alive_enabled</span><span class="special">(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">,</span> <span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">,</span> <span class="identifier">thread</span><span class="special">*</span> <span class="identifier">th</span><span class="special">=</span><span class="number">0</span><span class="special">);</span>
+<span class="special">}</span>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_mechanism_initialization"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_mechanism_initialization" title="Keep
+ alive mechanism initialization">Keep
+ alive mechanism initialization</a>
+</h6></div></div></div>
+<p>
+ There is a single controller <code class="computeroutput"><span class="identifier">keep_alive_mgr</span></code>.
+ The controler needs to access some thread specific shared context
+ <code class="computeroutput"><span class="identifier">thread_keep_alive_ctx</span></code>
+ to be able to control a thread.
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">detail</span> <span class="special">{</span>
+ <span class="keyword">struct</span> <span class="identifier">thread_keep_alive_ctx</span> <span class="special">{</span>
+ <span class="comment">// ...
+</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">init</span><span class="special">();</span>
+
+ <span class="keyword">typedef</span> <span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">></span> <span class="identifier">tssp</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">tssp</span> <span class="identifier">instance_</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">thread_decoration</span> <span class="identifier">initializer_</span><span class="special">;</span>
+ <span class="identifier">thread_keep_alive_internal</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">};</span>
+ <span class="keyword">struct</span> <span class="identifier">keep_alive_mgr</span> <span class="special">{</span>
+ <span class="comment">// ...
+</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">initialize</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">flag</span><span class="special">,</span> <span class="identifier">init</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">init</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">instance_</span><span class="special">=</span><span class="keyword">new</span> <span class="identifier">keep_alive_mgr</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread_</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span> <span class="identifier">flag_</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">keep_alive_mgr</span><span class="special">*</span> <span class="identifier">instance_</span><span class="special">;</span>
+ <span class="special">};</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The initialization of the controller itself and the setting the thread
+ specific context is done using an internal thread decoration <code class="computeroutput"><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">initializer_</span></code> with <code class="computeroutput"><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">init</span></code>
+ as setup function.
+ </p>
+<pre class="programlisting"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">></span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance_</span><span class="special">;</span>
+<span class="identifier">thread_decoration</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">initializer_</span><span class="special">(</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">init</span><span class="special">);</span>
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span> <span class="identifier">keep_alive_mgr</span><span class="special">::</span><span class="identifier">flag</span><span class="special">;</span>
+</pre>
+<p>
+ This setup function will initialize the <code class="computeroutput"><span class="identifier">keep_alive_mgr</span></code>
+ and then set the <code class="computeroutput"><span class="identifier">thread_specific_shared_ptr</span><span class="special"><></span></code> with a new <code class="computeroutput"><span class="identifier">thread_keep_alive_ctx</span></code>.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">init</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">keep_alive_mgr</span><span class="special">::</span><span class="identifier">initialize</span><span class="special">();</span>
+ <span class="identifier">instance_</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">());</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The <code class="computeroutput"><span class="identifier">keep_alive_mgr</span><span class="special">::</span><span class="identifier">initialize</span></code>
+ function ensures just that the init function is called once using the
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code>. This <code class="computeroutput"><span class="identifier">init</span></code>
+ function creates the instance of the <code class="computeroutput"><span class="identifier">keep_alive_mgr</span></code>
+ singleton.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">keep_alive_mgr</span><span class="special">::</span><span class="identifier">initialize</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">flag_</span><span class="special">,</span> <span class="identifier">init</span><span class="special">);</span>
+<span class="special">}</span>
+<span class="keyword">void</span> <span class="identifier">keep_alive_mgr</span><span class="special">::</span><span class="identifier">init</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">instance_</span><span class="special">=</span><span class="keyword">new</span> <span class="identifier">keep_alive_mgr</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_threads"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_threads" title="
+ Which threads can be controlled?">
+ Which threads can be controlled?</a>
+</h6></div></div></div>
+<p>
+ As the keep alive mechanism uses a thread decoration, the user needs
+ to explicitly call the <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span></code>
+ function at the begining of the thread function or by wrapping the
+ thread function. Instead of having a specific function to call or use
+ a thread function wrapper, the keep alive uses the functions provided
+ by the thread decorator (<code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span></code>
+ and <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_decorator</span></code>). So we must either
+ call <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span></code> explicitly on the thread
+ function
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fct</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">bith</span><span class="special">::</span><span class="identifier">decorate</span><span class="special">();</span>
+ <span class="comment">// ...
+</span><span class="special">}</span>
+</pre>
+<p>
+ or create the thread with the <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_decorator</span></code>
+ wrapper
+ </p>
+<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">bith</span><span class="special">::</span><span class="identifier">make_decorator</span><span class="special">(</span><span class="identifier">fct</span><span class="special">));</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_enabling"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_enabling" title="
+ Enabling the keep alive mechanism">
+ Enabling the keep alive mechanism</a>
+</h6></div></div></div>
+<p>
+ To be controled by the keep alive manager we need to enable the mechanism
+ using the enable_keep_alive. By default this enabler requires the application
+ to do at least one check point every 2 seconds using the <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">keep_alive_point</span><span class="special">()</span></code>
+ function.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fct</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">using</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">;</span>
+
+ <span class="comment">// ...
+</span> <span class="identifier">enable_keep_alive</span> <span class="identifier">ena</span><span class="special">;</span>
+ <span class="comment">// states that the thread will be declared dead if threre are
+</span> <span class="comment">// less that 1 check_points in 2 seconds.
+</span> <span class="keyword">for</span><span class="special">(;;)</span> <span class="special">{</span>
+ <span class="comment">// do a check point
+</span> <span class="identifier">keep_alive_point</span><span class="special">();</span>
+ <span class="comment">// ...
+</span> <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_disabling"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_disabling" title="
+ Disabling the keep alive mechanism">
+ Disabling the keep alive mechanism</a>
+</h6></div></div></div>
+<p>
+ Some times we need to do an external task that could take an undefined
+ time. We can then disable the keep alive mechanisme by using a disabler
+ <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">disable_keep_alive</span></code>.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fct</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">using</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">;</span>
+
+ <span class="comment">// ...
+</span> <span class="comment">// states that the thread will be declared dead if threre are
+</span> <span class="comment">// less that 1 check_points in 2 seconds.
+</span> <span class="identifier">enable_keep_alive</span> <span class="identifier">enabler</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(;;)</span> <span class="special">{</span>
+ <span class="comment">// do a check point
+</span> <span class="identifier">keep_alive_point</span><span class="special">();</span>
+
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">cnd</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// when a blocking task spending an undefined time
+</span> <span class="comment">// you can disable the keep alive mechanism
+</span> <span class="identifier">disable_keep_alive</span> <span class="identifier">disabler</span><span class="special">;</span>
+
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ If on the contrary we don't want to disable the keep alive mechanism,
+ it should be interesting to do a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">interruption_check_point</span><span class="special">()</span></code> just after the blocking task. In
+ this way if the task takes too much time and the thread is declared
+ dead, the possibility to manage the keep alive error by interrupting
+ the dead thread remains, once the task is finished.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fct</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">;</span>
+ <span class="keyword">using</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">;</span>
+
+ <span class="comment">// ...
+</span> <span class="comment">// states that the thread will be declared dead if threre are
+</span> <span class="comment">// less that 1 check_points in 2 seconds.
+</span> <span class="identifier">enable_keep_alive</span> <span class="identifier">enabler</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(;;)</span> <span class="special">{</span>
+ <span class="comment">// do a check point
+</span> <span class="identifier">keep_alive_point</span><span class="special">();</span>
+
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">cnd</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// when a blocking task spending an undefined time
+</span> <span class="comment">// you can disable the keep alive mechanism
+</span> <span class="identifier">unknow_time_task</span><span class="special">();</span>
+ <span class="identifier">interruption_check_point</span><span class="special">();</span>
+
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_persistent"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.keep_alive_persistent" title="
+ Configuring the dead persistency">
+ Configuring the dead persistency</a>
+</h6></div></div></div>
+<p>
+ The default enabling parameters could be too restrictive in some cases.
+ But the <code class="computeroutput"><span class="identifier">enable_keep_alive</span></code>
+ configures it with the two parameters. We can declare a thread dead
+ when the thread has not done a number of checkins in a given period.
+ This can be useful when one knows the time a given task should take.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fct</span><span class="special">()</span> <span class="special">{</span>
+ <span class="keyword">using</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">;</span>
+
+ <span class="comment">// ...
+</span> <span class="comment">// states that the thread will be declared dead if threre are
+</span> <span class="comment">// less that 4 check_points in 30 seconds.
+</span> <span class="identifier">enable_keep_alive</span> <span class="identifier">enabler</span><span class="special">(</span><span class="number">15</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+ <span class="keyword">for</span><span class="special">(;;)</span> <span class="special">{</span>
+
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">cnd</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// it is know that this task will take no more than 15 seconds
+</span> <span class="identifier">enable_keep_alive</span> <span class="identifier">control</span><span class="special">(</span><span class="number">15</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">know_time_task</span><span class="special">();</span>
+ <span class="identifier">keep_alive_point</span><span class="special">();</span>
+ <span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruprion_check_point</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="special">}</span>
+ <span class="comment">// ...
+</span><span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from_the_current_thread"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from_the_current_thread" title="Access
+ from the current thread">Access
+ from the current thread</a>
+</h6></div></div></div>
+<p>
+ But how all this works. We start with enablers/disablers. Enablers/disablers
+ use RAII, so they can be nested and the context be restored on the
+ destructor. At the construction they store the current state of the
+ keep alive of this thread using the backup function and then they enable/disable
+ the KA mechanism. On destruction they restore the backed up context.
+ </p>
+<pre class="programlisting"><span class="identifier">enable_keep_alive</span><span class="special">::</span><span class="identifier">enable_keep_alive</span><span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">periods</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">checkins</span><span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">backup_</span><span class="special">=</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">backup</span><span class="special">(</span><span class="identifier">data_</span><span class="special">);</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">enable_keep_alive</span><span class="special">(</span><span class="identifier">periods</span><span class="special">,</span> <span class="identifier">checkins</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="identifier">enable_keep_alive</span><span class="special">::~</span><span class="identifier">enable_keep_alive</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">restore</span><span class="special">(</span><span class="identifier">backup_</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="identifier">disable_keep_alive</span><span class="special">::</span><span class="identifier">disable_keep_alive</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">backup_</span><span class="special">=</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">backup</span><span class="special">(</span><span class="identifier">data_</span><span class="special">);</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">disable_keep_alive</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="identifier">disable_keep_alive</span><span class="special">::~</span><span class="identifier">disable_keep_alive</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">restore</span><span class="special">(</span><span class="identifier">backup_</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ These functions are quite simple
+ </p>
+<pre class="programlisting"><span class="identifier">thread_keep_alive_internal</span><span class="special">*</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">backup</span><span class="special">(</span><span class="identifier">thread_keep_alive_internal</span><span class="special">*</span> <span class="identifier">new_data</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">thread_keep_alive_internal</span><span class="special">*</span> <span class="identifier">the_backup</span><span class="special">=</span><span class="identifier">data_</span><span class="special">;</span>
+ <span class="identifier">data_</span><span class="special">=</span><span class="identifier">new_data</span>
+ <span class="keyword">return</span> <span class="identifier">the_backup</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">restore</span><span class="special">(</span><span class="identifier">thread_keep_alive_internal</span><span class="special">*</span> <span class="identifier">backup</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">data_</span><span class="special">=</span><span class="identifier">backup</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">enable_keep_alive</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">enabled_</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
+<span class="special">}</span>
+<span class="keyword">void</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">disable_keep_alive</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">enabled_</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Note that there is no need to check if the <code class="computeroutput"><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance_</span></code>
+ contains a pointer because we have ensured that at initialization time.
+ </p>
+<p>
+ Next there is the central function <code class="computeroutput"><span class="identifier">keep_alive_point</span><span class="special">()</span></code>. This function does nothing more
+ than relaying the request to the specific context of this thread. This
+ function just increases the number of <code class="computeroutput"><span class="identifier">checkins_</span></code>.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">keep_alive_point</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">check_point</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">check_point</span><span class="special">()</span> <span class="special">{</span>
+ <span class="special">++</span><span class="identifier">data_</span><span class="special">-></span><span class="identifier">checkins_</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The <code class="computeroutput"><span class="identifier">set_on_dead_thread</span><span class="special">()</span></code> does the same. This function just
+ stores the on-dead action.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">,</span> <span class="identifier">thread</span><span class="special">*</span> <span class="identifier">th</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">()-></span><span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">fct</span><span class="special">,</span> <span class="identifier">th</span><span class="special">);</span>
+<span class="special">}</span>
+
+ <span class="keyword">void</span> <span class="identifier">set_on_dead_thread</span><span class="special">(</span><span class="identifier">on_dead_thread_type</span> <span class="identifier">fct</span><span class="special">,</span> <span class="identifier">thread</span><span class="special">*</span> <span class="identifier">th</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">on_dead_</span><span class="special">=</span><span class="identifier">fct</span><span class="special">;</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">thread_ptr_</span><span class="special">=</span><span class="identifier">th</span><span class="special">;</span>
+ <span class="special">}</span>
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from__the_controller_thread"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.keep_alive.access_from__the_controller_thread" title="Access
+ from the controller thread">Access
+ from the controller thread</a>
+</h6></div></div></div>
+<p>
+ Up to now we have seen the use of <code class="computeroutput"><span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span></code>
+ as a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code>, i.e. it is used
+ from the current thread.
+ </p>
+<p>
+ We will see now how the controler behaves. The single instance of the
+ keep_alive_mgr has been created on the init function.
+ </p>
+<p>
+ The constructor just constructs a thread with the loop function.
+ </p>
+<pre class="programlisting"><span class="identifier">keep_alive_mgr</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">end_</span><span class="special">(</span><span class="keyword">false</span><span class="special">),</span> <span class="identifier">thread_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">loop</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">end_</span><span class="special">)))</span> <span class="special">{}</span>
+</pre>
+<p>
+ The loop function will iterate, every second, over all the thread_keep_alive_ctx
+ threads specific contexts asking them to control themselves. Note that
+ as the map can be modified when threads are created or finished, we
+ need to protect the iteration externally with a lock on the protecting
+ mutex.
+ </p>
+<pre class="programlisting"><span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">(</span><span class="keyword">bool</span><span class="special">&</span> <span class="identifier">end</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="identifier">t</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime_get</span><span class="special">(&</span><span class="identifier">t</span><span class="special">,</span><span class="number">1</span><span class="special">);</span>
+ <span class="keyword">while</span><span class="special">(!</span><span class="identifier">end</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">t</span><span class="special">.</span><span class="identifier">sec</span> <span class="special">+=</span> <span class="number">1</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">sleep</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span>
+ <span class="identifier">lock_type</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">().</span><span class="identifier">get_mutex</span><span class="special">());</span>
+ <span class="keyword">const</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">tssp</span><span class="special">::</span><span class="identifier">map_type</span><span class="special">&</span> <span class="identifier">tmap</span><span class="special">(</span>
+ <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">instance</span><span class="special">().</span><span class="identifier">get_map</span><span class="special">());</span>
+ <span class="identifier">thread_keep_alive_ctx</span><span class="special">::</span><span class="identifier">tssp</span><span class="special">::</span><span class="identifier">map_type</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">tmap</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="keyword">for</span> <span class="special">(;</span><span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">tmap</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">it</span><span class="special">-></span><span class="identifier">second</span><span class="special">.</span><span class="identifier">control</span><span class="special">(</span><span class="identifier">it</span><span class="special">-></span><span class="identifier">first</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The thread loops until the end variable is true. In order to stop proprely
+ this thread we will use the destructor of singleton instance. This
+ end variable is a reference to a variable stored on the keep_alive_mgr
+ context which has been initialized staticly. So its destrcutor will
+ be called when the program finishes. So it is up to the destructor
+ to set this variable and wait for the thread completion
+ </p>
+<pre class="programlisting"><span class="special">~</span><span class="identifier">keep_alive_mgr</span><span class="special">()</span> <span class="special">{</span>
+ <span class="identifier">end_</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
+ <span class="identifier">thread_</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The thread_keep_alive_ctx::control function behaves as follows: if
+ it is enabled, it decreases the number of remaining periods and if
+ the thread is declared dead it executes the on dead action and resets
+ the check-ins and periods.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">control</span><span class="special">(</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">data_</span><span class="special">-></span><span class="identifier">enabled_</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">--</span><span class="identifier">data_</span><span class="special">-></span><span class="identifier">periods_</span><span class="special">;</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">dead</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">on_dead</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">checkins_</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
+ <span class="identifier">data_</span><span class="special">-></span><span class="identifier">periods_</span><span class="special">=</span><span class="identifier">data_</span><span class="special">-></span><span class="identifier">total_periods</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple" title="Thread
+ Tuple">Thread
+ Tuple</a>
+</h5></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_launching">
+ Launching thread tuple</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_exceptions">
+ Exceptions in thread functions</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_joining">
+ Joining and detaching</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_interruption">
+ Interruption</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_launching"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_launching" title="
+ Launching thread tuple">
+ Launching thread tuple</a>
+</h6></div></div></div>
+<p>
+ A new thread tuple is launched by passing a collection of objects of
+ some callable type, that can be invoked with no parameters. These objects
+ are then copied into internal storage, and invoked on the newly-created
+ threads of execution. If the objects must not (or cannot) be copied,
+ then <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> can be used to pass in a reference
+ to the function object. In this case, the user of <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> must ensure that the referred-to
+ object outlives the newly-created thread of execution.
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">callable</span>
+<span class="special">{</span>
+ <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span>
+<span class="special">};</span>
+
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">copies_are_safe</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">callable</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="identifier">callable</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</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="special">}</span> <span class="comment">// x and y are destroyed, but the newly-created threads have a copy, so this is OK
+</span>
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">oops</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">callable</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="identifier">callable</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">y</span><span class="special">));</span>
+<span class="special">}</span> <span class="comment">// x and y are destroyed, but the newly-created threads still have a reference
+</span> <span class="comment">// this leads to undefined behaviour
+</span></pre>
+<p>
+ If you wish to construct an instance of <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> with a function or callable
+ object that requires arguments to be supplied, this can NOT be done
+ by passing additional arguments as is the case for threads to the
+ <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ constructor, and you will need to use bind explicitly.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">find_the_question</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">the_answer</span><span class="special">);</span>
+
+<span class="identifier">bith</span><span class="special">::</span><span class="identifier">thread_tuple</span><span class="special"><</span><span class="number">2</span><span class="special">></span> <span class="identifier">deep_thought_2</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">find_the_question</span><span class="special">,</span><span class="number">42</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">find_the_question</span><span class="special">,</span><span class="number">16</span><span class="special">));</span>
+</pre>
+<p>
+ The arguments are <span class="emphasis"><em>copied</em></span> into the internals of
+ Boost.Bind structure: if a reference is required, use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code>, just as for references to callable
+ functions.
+ </p>
+<p>
+ The limit on the number of additional arguments that can be passed
+ are specified by the Boost.Bind.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_exceptions"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_exceptions" title="
+ Exceptions in thread functions">
+ Exceptions in thread functions</a>
+</h6></div></div></div>
+<p>
+ If the function or callable object passed to the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> constructor propagates an exception
+ that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>,
+ when invoked, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code>
+ is called.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_joining"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_joining" title="
+ Joining and detaching">
+ Joining and detaching</a>
+</h6></div></div></div>
+<p>
+ When the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object that represents a collection
+ of threads of execution is destroyed, the threads become <span class="emphasis"><em>detached</em></span>.
+ Once threads are detached, they will continue executing until the invocation
+ of the functions or callable objects supplied on construction completes,
+ or the program is terminated. The threads of a <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> can also be detached by explicitly
+ invoking the detach member function on the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object. In this case, all the
+ threads of the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object cease to represent the
+ now-detached thread, and instead represents 'Not-a-Thread.
+ </p>
+<p>
+ In order to wait for a tuple of threads of execution to finish, the
+ <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ or <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code>
+ member functions of the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object must be used. <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ will block the calling thread until the all the threads represented
+ by the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object have completed. If the
+ threads of execution represented by the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> object have already completed,
+ or the <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code> objects represents <span class="emphasis"><em>Not-a-Thread</em></span>,
+ then <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code>
+ returns immediately. <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code> is similar, except that a call to
+ <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code>
+ will also return if the threads being waited for do not complete when
+ the specified time has elapsed.
+ </p>
+<p>
+ There is also a possibility to wait until the first thread completes,
+ interrupting the rest of the threads.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_interruption"></a><a href="tutorial.html#toward_boost_interthreads.users_guide.tutorial.thread_extensions.thread_tuple.thread_tuple_interruption" title="
+ Interruption">
+ Interruption</a>
+</h6></div></div></div>
+<p>
+ A tuple of running threads can be <span class="emphasis"><em>interrupted</em></span>
+ by invoking the <code class="computeroutput"><span class="identifier">interrupt_all</span><span class="special">()</span></code> member function of the corresponding
+ <code class="computeroutput"><span class="identifier">thread_tuple</span><span class="special"><></span></code>
+ object. When the interrupted threads next execute one of the specified
+ <span class="emphasis"><em>interruption points</em></span> (or if it is currently <span class="emphasis"><em>blocked</em></span>
+ whilst executing one) with interruption enabled, then a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> exception will
+ be thrown in the interrupted thread. If not caught, this will cause
+ the execution of the interrupted thread to terminate. As with any other
+ exception, the stack will be unwound, and destructors for objects of
+ automatic storage duration will be executed.
+ </p>
+<p>
+ See the Boost.Threads
+ library on how to avoid a thread being interrupted.
+ </p>
+<p>
+ At any point, the interruption state for the current thread can be
+ queried by calling <code class="computeroutput"><span class="identifier">interruption_enabled</span></code>.
+ </p>
+<a name="interruption_points"></a><p>
+ </p>
+<p>
+ See the Boost.Threads
+ library for the Predefined Interruption Points.
+ </p>
+</div>
+</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 -2009 Vicente J. Botet Escriba<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="getting_started.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../users_guide.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Modified: sandbox/interthreads/libs/interthreads/doc/implementation.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/implementation.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/implementation.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -41,11 +41,11 @@
[This library maps thread IDs to thread specific pointers to avoid contention on a single map.]]
[[Default versus explicit specific context setting]
-[This library provides explicit setting. In future release will provide explicit/eager and implicit/lazy specific context setting.]]
+[This library provides explicit setting. In future release will provide explicit/eager and implicit/lazy specific context setting. Note that implicit setting will need a factory or a default constructible type.]]
-[[Ordered or unordered map] [The current implementation use an ordered map. Future version will allow the user to configure this.]]
+[[Ordered or unordered map] [While the thread::id type is ordered, there is no need to use it. The current implementation use an ordered map. Future version will allow the user to configure this.]]
-[[Intrusive or not maps] [As the thread specific pointer is stored on only one map the current implementation use the intrusive container.]]
+[[Intrusive or not maps] [As the thread specific pointer is stored on only one map the implementation could use an intrusive container. This will be provided in future releases]]
[[Shared versus exclusive locking] [Locating the right TS pointer requires the use of mutex to prevent race conditions. The library use a a shared_mutex
because most of the access to the map will be readings by other threads. The problem is that the native conditions can not be used directly with
@@ -60,8 +60,8 @@
[variablelist
[[Ensuring keep alive manager singleton is initialized and the thread specific shared storage is set before use]
-[The use of the thread preamble ensures that the preables are called before the user thread function is called.
-The keep_alive preable use the call_once to ensure that the keep_alive manager is correctly initialized.]]
+[The use of the thread decoration ensures that the decoration are called before the user thread function is called.
+The keep_alive decoration use the call_once to ensure that the keep_alive manager is correctly initialized.]]
[[backup/restore context] [The real thread specific data is stored directly on the stack of enablers/disablers avoiding heap memory.
On enablers/disablers construction they store a backup pointer to the nesting context. This allows a quick restore.
@@ -75,8 +75,8 @@
[variablelist
[[Joining the first finishing thread]
-[In order to synchronize the finish of all the threads we use a internal class which store the index of the first
-thread notifying that it is finished. As the user function has no ideaof this index we wrap the user thread functions.
+[In order to synchronize the end of all the threads the libarry use a internal class which stores the index of the first
+thread notifying that it is finished. As the user function has no idea of this index we need to wrap the user thread functions.
]]
]
Modified: sandbox/interthreads/libs/interthreads/doc/installation.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/installation.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/installation.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -75,29 +75,7 @@
]
]
-In addition it depends on the following libraries that are not yet accepted on Boost
-[variablelist
-[
- [[@http://www.boost.org/libs/futures [*Boost.Futures]]] [for futures]
-]
-[
- [[@http://www.boost.org/libs/tp [*Boost.ThreadPool]]] [Only when using the __AE_ boost::tp::pool and the __ACT__ boost::tp::task]
-]
-]
-
-And also could depend conditionaly on the following libraries that even not submited on Boost.
-[variablelist
-[
- [[@http://www.boost.org/libs/chrono [*Boost.Chrono]]] [for time and duration]
-]
-[
- [[@http://www.boost.org/libs/move [*Boost.Move]]] [to emulate the move semantic.]
-]
-[
- [[@https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.SmartPtr.UniquePtr [*Boost.SmartPtr.UniquePtr]]] [for unique_ptr, ...]
-]
-]
[/========================]
[heading Exceptions safety]
Modified: sandbox/interthreads/libs/interthreads/doc/interthreads.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/interthreads.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/interthreads.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -150,7 +150,7 @@
[def __apply__ `apply`]
-[warning InterThreads is not a part of the Boost libraries.]
+[warning Toward Boost.InterThreads is not a part of the Boost libraries.]
[include overview.qbk]
Modified: sandbox/interthreads/libs/interthreads/doc/introduction.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/introduction.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/introduction.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -10,420 +10,6 @@
[section:motivation Motivation]
[/============================]
-[section Asynchronous Executors and Asynchronous Completion Token Handles]
-[/=======================================================================]
-
-In [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf N1833 - Preliminary Threading Library Proposal for TR2]
-Kevlin Henney introduces the concept of `threader` an asynchronous executor and a function `thread()` that evaluates a function
-asynchronously and returns an asynchronous completion token `joiner`, able to join but also to get the value of the function result.
-
-In [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2185.html N2185 - Proposed Text for Parallel Task Execution]
-Peter Dimov introduces a `fork()` function able to evaluate a function asynchronously and returns a `future` handle.
-
-In [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2276.html N2276 - Thread Pools and Futures]
-Anthony William introduces `launch_in_thread` and `launch_in_pool` function templates which
-evaluates a function asynchronously either in a specific `thread` or a thread pool and
-returns a `unique_future` handle.
-
-In [@http://www.boostpro.com/vault/index.php?action=downloadfile&filename=boost-threadpool.3.tar.gz&directory=Concurrent%20Programming& Boost.ThreadPool]
-Oliver Kowalke proposes a complete implementation of a thread `pool` with a `submit()` function
-which evaluates a function asynchronously and returns a `task` handle.
-
-Behind all these proposals there is a concept of asynchronous executor, fork-like function and
-the asynchronous completion token handle.
-
-[table AE/ACT/fork-like relationship
- [
- [[*Proposal]] [[*executor]] [[*fork-like]] [[*ACT handle]]
- ]
- [
- [Boost.Thread] [`thread` class] [`thread()` constructor] [__thread__]
- ]
- [
- [Boost.ThreadPool] [__tp_pool__] [`submit()`] [__tp_task__]
- ]
- [
- [N2276] [__thread__] [`launch_in_thread()`] [`unique_future<T>`]
- ]
- [
- [N2276] [thread_pool] [`launch_in_pool()`] [`unique_future<T>`]
- ]
- [
- [N2185] [thread pool] [`fork()`] [`future<T>`]
- ]
- [
- [N1833] [`threader`] [`thread()`] [`joiner<T>`]
- ]
-]
-
-The asynchronous completion token models can follow two interfaces, the thread interface and
-the future interface. Some asynchronous completion tokens handle allow to recover the result of the evaluation of
-the function, others allow to manage the underlying thread of execution.
-
-It seems natural to make a generic __fork__ function that will evaluate a function asynchronously
-with respect to the calling thread and returns an ACT handle. The following metafunction
-associates an ACT handle to an asynchronous executor.
-
- template <typename AE, typename T>
- struct asynchronous_completion_token {
- typedef typename AE::template handle<T>::type type;
- };
-
-The result of forking a nullary function by an asynchronous executor is given by the metafunction result_of::fork<AE,F>
-
- namespace result_of {
- template <typename AE,typename F>
- struct __c_fork__ {
- typedef typename boost::result_of<F()>::type result_type;
- typedef typename asynchronous_completion_token<AE, result_type>::type type;
- };
- }
-
-The default implementation of fork delegates on fork asynchronous executor function.
-
- template< typename AE, typename F >
- typename result_of::fork<AE, F>::type fork( AE& ae, F fn ) {
- return ae.fork(fn);
- }
-
-Forking n-ary functions rely on the nullary version and bind.
-
- template< typename AE, typename F, typename A1, ..., typename An >
- typename asynchronous_completion_token<AE,
- typename boost::result_of<F(A1,..., An)>::type >::type
- fork( AE& ae, F fn, A1 a1, ..., An an ) {
- return ae.fork( bind( fn, a1, ..., an ) );
- }
-
-We can define a basic_threader which just returns a new thread as follows:
-
- class basic_threader {
- public:
- template <typename T>
- struct handle {
- typedef boost::thread type;
- };
-
- template <typename F>
- boost::thread fork(F f) {
- thread th(f);
- return boost::move(th);
- }
- };
-
-The library includes also a launcher class that creates a thread and returns a unique_future when forking
-
- class launcher {
- public:
- template <typename T>
- struct handle {
- typedef unique_future<T> type;
- };
- template <typename F>
- unique_future<typename result_of<F()>::type>
- fork(F f) {
- typedef typename boost::result_of<F()>::type result_type;
- packaged_task<result_type> tsk(f);
- unique_future<result_type> res = tsk.get_future();
- thread th(boost::move(tsk));
- return res;
- }
- };
-
-and a shared_launcher class that creates a thread and returns a shared_future when forking.
-
-Given the sequential example:
-
- double f( double a, int n )
- {
- double r = 0.0;
-
- for( int i = 1; i <= n; ++i )
- {
- double x = 1.0 / i;
- r += std::pow( x, a );
- }
-
- return r;
- }
-
- int main()
- {
- double m1 = f( 1.0, 1000000 );
- double m2 = f( 1.0, 5000000 );
- double m3 = f( 2.2, 1000000 );
- double m4 = f( 2.2, 5000000 );
-
- std::cout << m2 - m1 + m3 - m4 << std::endl;
- }
-
-The library allows a programmer to switch to parallel execution as follows:
-
- int main()
- {
- launcher l;
- boost::unique_future<double> fm1 = bith::fork( l, f, 1.0, 1000000 );
- boost::unique_future<double> fm2 = bith::fork( l, f, 1.0, 5000000 );
- boost::unique_future<double> fm3 = bith::fork( l, f, 2.2, 1000000 );
- boost::unique_future<double> fm4 = bith::fork( l, f, 2.2, 5000000 );
-
- std::cout << fm2.get() - fm1.get() + fm3.get() - fm4.get() << std::endl;
- }
-
-
-The question now is how we can adapt the example to an existing asynchronous executor such as
-the Boost.ThreadPool library. We need to specialize the template class
-asynchronous_completion_token to state which is the __ACT__ associate to the __tp_pool__.
-
- namespace boost { namespace interthreads {
-
- template <typename Channel, typename T>
- struct asynchronous_completion_token<boost::tp::pool<Channel>,T> {
- typedef boost::tp::task<T> type;
- };
-
- }}
-
-and also to specialize the fork function as the default one requires a fork member function and __tp_pool__ provides a `submit()` member function`
-
- namespace boost { namespace interthreads {
-
- template< typename Channel, typename F >
- result_of::fork<boost::tp::pool<Channel>, F>::type
- fork<boost::tp::pool<Channel>,F>( boost::tp::pool<Channel>& ae, F fn ) {
- return ae.submit(fn);
- }
- }
- }
-
-Evidently these specializations must be done on the `boost::interthreads` namespace.
-
-As the preceding is ilegal in C++03 we need to use an auxiliary class to define the default behaviour of the fork function
-
- namespace partial_specialization_workaround {
- template< typename AE, typename F >
- struct fork {
- static typename result_of::fork<AE,F>::type apply(AE& ae, F fn ) {
- return ae.fork(fn);
- }
- };
- }
- template< typename AE, typename F >
- typename result_of::fork<AE,F>::type
- fork( AE& ae, F fn ) {
- return partial_specialization_workaround::fork<AE,F>::apply(ae,fn);
- }
-
-And specialize partially the partial_specialization_workaround::fork class
-
- namespace boost { namespace interthreads {
- namespace partial_specialization_workaround {
- template< typename Channel, typename F >
- struct fork<boost::tp::pool<Channel>,F> {
- static typename result_of::fork<boost::tp::pool<Channel>, F>::type
- apply( boost::tp::pool<Channel>& ae, F fn ) {
- return ae.submit(fn);
- }
- };
- }
- }}
-
-Note that only the __fork__ function needs to be specialized. The library provides the other overloadings.
-
-We can write the preceding main function in a more generic way
-
- template < typename AE>
- void do(AE& ae)
- {
- typedef bith::result_of::fork<AE, int(*)(double, int) >::type auto_type;
- auto_type fm1 = bith::fork(ae, f, 1.0, 1000000 );
- auto_type fm2 = bith::fork(ae, f, 1.0, 5000000 );
- auto_type fm3 = bith::fork(ae, f, 2.2, 1000000 );
- auto_type fm4 = bith::fork(ae, f, 2.2, 5000000 );
-
- std::cout << fm2.get() - fm1.get() + fm3.get() - fm4.get() << std::endl;
- }
-
- int main()
- {
- launcher ae;
- do(ae);
- }
-
-and we can switch from using the launcher or the tp::pool just by changing one line
-
- int main()
- {
- boost::tp::pool<> ae(boost::tp::poolsize(6))
- do(ae);
- }
-
-Instead of defining a type, the user can make use of BOOST_AUTO once the
-associated files included on the threadpool sub-directory.
-
- BOOST_AUTO(fm1, bith::fork(ae, f, 1.0, 1000000 ));
-
-
-The library allows also to fork several functions at one time
-
- result_of::fork_all<AE, int(*)(), int(*)(), int(*)()>::type handles = bith::fork_all(ae, f, g, h);
- std::cout << get<1>(res).get() - get<0>(res).get() + get<2>(res).get() << std::endl;
-
-
-The result of the fork_all operation is a fusion tuple of asynchronous completion token handles.
-The user can apply any fusion algorithm on this tuple as for example
-
- bool b = fusion::none(handles, fct::interruption_requested());
-
-The asynchronous completion token models follows two interfaces, the thread interface and the
-unique_/shared_future interface.
-
-To make common tasks easier the library provides some functors in the name space fct:
-for the thread interface as
-
-* fct::join
-* fct::join_until
-* fct::join_for
-* fct::detach
-* fct::interrupt
-* fct::interrupt_requested
-
-and for the future operations as
-
-* fct::get
-* fct::wait
-* fct::wait_until
-* fct::wait_for
-* fct::is_ready
-* fct::has_value
-* fct::has_exception
-
-Here is an example for get:
-
- namespace fct {
- struct get {
- template<typename ACT>
- typename ACT::result_type operator()(ACT& t) const {
- return t.get();
- }
- };
- }
-
-In addition the library provides some non member functions that are the result of applying
-these functors to the tuple using a fusion algorithm:
-
-* join_all
-* join_all_until
-* join_all_for
-* detach_all
-* interrupt_all
-* interrupt_requested_on_all
-
-* get_all
-* wait_all
-* wait_all_until
-* wait_all_for
-* are_all_ready
-* have_all_value
-* have_all_exception
-
-Next follows how get_all is defined.
-
- template <typename MovableTuple>
- typename result_of::get_all<Sequence>::type
- get_all(Sequence& t) {
- return fusion::transform(t, fct::get());
- }
-
-The library defines in a systematic way the result_of of a function as a metafunction
-having the same name as the function on the namespace result_of, as the Boost.Fusion library
-does.
-
- namespace result_of {
- template <typename Sequence>
- struct get_all {
- typedef typename fusion::result_of::transform<Sequence, fct::get>::type type
- };
- }
-
-So the user can do the following
-
- result_of::fork_all<AE, int(*)(), int(*)(), int(*)()>::type res = bith::fork_all(ae, f, g, h);
- result_of::get_all<result_of::fork_all<AE, int(*)(), int(*)(), int(*)()>::type>::type values
- = bith::get_all(handles);
-
-or using a typedef
-
- typedef result_of::fork_all<AE, int(*)(), int(*)(), int(*)()>::type auto_type;
- auto_type handles = bith::fork_all(ae, f, g, h);
- result_of::get_all<auto_type>::type values= bith::get_all(handles);
-
-Note that the notation can be shortened by using the C++0x auto keyword.
-
- auto res = bith::fork_all(ae, f, g, h);
- auto values = bith::get_all(handles);
-
-or using BOOST_AUTO
-
- BOOST_AUTO(res, bith::fork_all(ae, f, g, h));
- BOOST_AUTO(values, bith::get_all(handles));
-
-Last but not least the library provides also some sugaring functions like
-wait_for_all that forks and wait for the completion of all the functions.
-
- result_of::wait_for_all<AE, int(*)(), int(*)(), int(*)()>::type res = bith::wait_for_all(ae, f, g, h);
- std::cout << get<1>(res) - get<0>(res) + get<2>(res) << std::endl;
-
-and wait_for_any, which works only with functions that return the same type or are convertible to the same
-type, and return the index and the value of any of the completed functions.
-
- result_of::wait_for_any<AE, int(*)(), int(*)(), int(*)()>::type res = bith::wait_for_any(ae, f, g, h);
- std::cout << "function " << res.first << " finshed first with result=" << res.second << std::endl;
-
-The current implementation use the wait_for_any function so any AE must provide a way to get a
-unique|shared_future from its __ACT__.
-
-The library defines a functor allowing the user to specialize it
-
- template <typename AE>
- struct get_future {
- template <typename T>
- shared_future<T>& operator()(typename asynchronous_completion_token<AE,T>::type& act)
- { return act.get_future(); }
- };
-
-Future versions will use the set_once synchronization.
-
-Resuming a simple way to define a new AsynchronousExecutor is to define a class as
-
- struct AsynchronousExecutor {
- template <typename T>
- struct handle {
- typedef implementation-specific-type-modeling-a-ACT type;
- };
-
- template <typename F>
- typename handle<typename result_of<F()>::type>::type
- fork(F f);
- };
-
-
-
-
-[endsect]
-
-[section Threader/Joiner]
-[/=============================================================================]
-
-See the [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf N1833 - Preliminary Threading Library Proposal for TR2]
-where Kevlin Henney introduces the concept of threader as an asynchronous executor and a function thread that evaluates a function
-asynchronously and returns an asynchronous completion token joiner, able to join but also to get the value of the function result.
-
-The main specificity is that here we make a difference between unique_joiner (move-only) and shared_joiner and as consequence unique_threader and shared_threader.
-
-
-[endsect]
-
[section Decorators]
[/=============================================================================]
Modified: sandbox/interthreads/libs/interthreads/doc/models.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/models.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/models.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -10,260 +10,4 @@
[section Concepts]
[/===============]
-[/=============================================]
-[section Asynchronous Completion Token Concepts]
-[/=============================================]
-
-[/==================]
-[section Concept `ACT` ]
-[/==================]
-
-An __ACT__ allows to to wait for the completion of an asynchronous executed operation.
-An __ACT__ should be __Movable__ or __CopyConstructible__.
-
-[variablelist Notation
- [[`act`] [An __ACT__]]
- [[`f`] [A __Nullary__ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
-]
-
-[heading Expression requirements]
-A type models a __AE__ if, the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`act.wait()`] [void] [Constant]]
- [[`b = act.wait_until(abs_time)`] [bool] [Constant]]
- [[`b = act.wait_for(rel_time)`] [bool] [Constant]]
-]
-
-[heading Meta Expressions]
-[table
- [[Expression] [Type] [Compile Time Complexity]]
- [[`__is_movable__<ACT>::type`] [MPL boolean] [Constant]]
- [[`__has_future_if__<ACT>::type`] [MPL boolean] [Constant]]
- [[`__has_thread_if__<ACT>::type`] [MPL boolean] [Constant]]
-]
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`act.wait()`] [Waits until the `act` completes]]
- [[`b = act.wait_until(abs_time)`] [Waits until the `act` completes until `abs_time` is not reached]]
- [[`b = act.wait_for(rel_time)`] [Waits until the `act` completes for a `rel_time` duration]]
-]
-
-[heading Models]
-
-* __unique_future__
-* __shared_future__
-* __unique_joiner__
-* __shared_joiner__
-* __tp_task__
-* __thread__
-
-[endsect]
-
-[/=============================]
-[section Concept `FutureBasedACT` ]
-[/=============================]
-
-An __FutureBasedACT__ is a __ACT__ that associates a value expected on the its completion.
-
-[variablelist Notation
- [[`act`] [An __ACT__]]
- [[`f`] [A __Nullary_ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
- [[`v`] [T]]
-]
-
-[heading Expression requirements]
-A type models an __FutureBasedACT__ if, in adition to being an __ACT__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`b = act.is_ready()`] [bool] [Constant]]
- [[`b = act.has_exception()`] [bool] [Constant]]
- [[`b = act.has_value()`] [bool] [Constant]]
-]
-
-[heading Expression Semantics]
-[table
- [[Expression] [Semantics]]
- [[`b = act.is_ready()`] [Is true only if the associated state holds a value or an exception ready for retrieval.]]
- [[`b = act.has_exception()`] [true only if the associated state contains an exception.]]
- [[`b = act.has_value()`] [true only if the associated state contains a value]]
- [[`v = act.get()`] [returns the stored value]]
-]
-
-[heading Models]
-
-* __unique_future__
-* __shared_future__
-* __unique_joiner__
-* __shared_joiner__
-* __tp_task__
-
-[endsect]
-
-[/=============================]
-[section Concept `ThreadBasedACT` ]
-[/=============================]
-
-An __FutureBasedACT__ is a __ACT__ that associates a value expected on the its completion.
-
-[variablelist Notation
- [[`act`] [An __ACT__]]
- [[`f`] [A __Nullary_ function with type F]]
- [[`abs_time`] [A __system_time__]]
- [[`rel_time`] [A __Duration__]]
- [[`b`] [A bool]]
- [[`id`] [A thread::id]]
-]
-
-[heading Expression requirements]
-A type models an __FutureBasedACT__ if, in adition to being an __ACT__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`act.join()`] [void] [Constant]]
- [[`b = act.joinable()`] [bool] [Constant]]
- [[`b = act.join_until(abs_time)`] [bool] [Constant]]
- [[`b = act.join_for(rel_time)`] [bool] [Constant]]
- [[`act.detach()`] [void] [Constant]]
- [[`act.interrupt()`] [void] [Constant]]
- [[`b = act.interruption_requested()`] [bool] [Constant]]
- [[`id = act.get_id()`] [bool] [Constant]]
-]
-
-[heading Expression Semantics]
-[table
- [[Expression] [Semantics]]
- [[`act.join()`] [Constant]]
- [[`b = act.joinable()`] [Constant]]
- [[`b = act.join_until(abs_time)`] [Constant]]
- [[`b = act.join_for(rel_time)`] [Constant]]
- [[`act.detach()`] [Constant]]
- [[`act.interrupt()`] [Constant]]
- [[`b = act.interruption_requested()`] [Constant]]
- [[`is = act.get_id()`] [Constant]]
-]
-
-[heading Models]
-
-* __unique_joiner__
-* __shared_joiner__
-* __thread__
-* __tp_task__
-
-[endsect]
-
-[endsect]
-
-[/======================================]
-[section Asynchronous Executors Concepts]
-[/======================================]
-
-[/==========================================================================================]
-[section Concept `AsynchronousExecutor`]
-[/==========================================================================================]
-
-An __AsynchronousExecutor__ executes asynchronously a function and returns an __ACT__ when calling the fork function on it.
-
-[variablelist Notation
- [[`ae`] [An __AE__]]
- [[`f`] [A Nullary function with type F]]
- [[`act`] [An __ACT__]]
-]
-
-[heading Expression requirements]
-A type models a __AE__ if, the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`__fork__(ae, f)`] [__ACT__] [Constant]]
- [[`get_future<AE>()(act)`] [__Future__] [Constant]]
- [[`__asynchronous_completion_token__<AE, T>::type`] [Model of __ACT__ satisfying `__act_value<ACT>::type` is `T`] [Constant]]
-]
-
-[heading Meta Expressions]
-[table
- [[Expression] [Model Of] [Compile Time Complexity]]
- [[`get_future<AE>::type`] [] [Amortized constant time]]
- [[`__result_of_advance_c__<I, N>::type`] [] [Linear]]
-]
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`act = __fork__(ae, f)`] [request `ae` to execute asynchronously the function `f`and returns an __ACT__ ]]
- [[`get_future<AE>()(act)`] [gets a reference to a __Future__]]
-]
-
-[heading Constraints]
-The following constraints applies:
-
-* `act_value<__ACT__>::type == boost::result_of<F()::type>`
-
-[heading Models]
-
-* __unique_threader__
-* __shared_threader__
-
-[endsect]
-
-
-[/==========================================================================================]
-[section Concept `IntrinsicAsynchronousExecutor`]
-[/==========================================================================================]
-
-
-The default fork implementation put some requirements in its __AE__ parameter. This concept is related to this.
-An __IAE__ is __AE__ that works well with the default implementation of __fork__.
-
-[variablelist Notation
- [[`ae`] [An __IAE__]]
- [[`f`] [A __Nullary__ function]]
-]
-
-[heading Expression requirements]
-A type models an __IAE__ if, in adition to being an __AE__,
-the following expressions are valid:
-
-[table
- [[Expression] [Return type] [Runtime Complexity]]
- [[`ae.fork(f)`] [`handle<boost::result_of<F()>::type`] [Constant]]
-]
-
-[heading Meta Expressions]
-[table
- [[Expression] [Model Of] [Compile Time Complexity]]
- [[`handle<boost::result_of<F()>::type`] [__ACT__] [Constant ]]
-]
-
-[heading Expression Semantics]
-[
-table
- [[Expression] [Semantics]]
- [[`ae.fork(f)`] [executes asynchronously the function `f`and returns a __handle__ ]]
-]
-
-
-[heading Models]
-* __unique_threader__
-* __shared_threader__
-
-
-[endsect]
-
-[endsect]
-
[endsect]
Modified: sandbox/interthreads/libs/interthreads/doc/overview.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/overview.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/overview.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -15,36 +15,18 @@
__boost_interthreads__ extends __boost_thread__ adding some features:
-* An asynchronous execution framework working with __AE__ and __ACT__. It includes some generic functions and several __AE__ and __ACT__:
- * fork and fork_all to execute asynchronously functions
- * fork_after: request an __AE__ to execute a function asynchronously once each one of __ACT__ in the dependency tuple parameter are ready. It is similar to the async_with_dependencies proposed Peter Dimov.
- * generic get, join, ... free functions to synchroyze on an __ACT__
- * generic get_all, join_all, ... free functions to synchroyze on multiple __ACT__
- * generic wait_for_all, wait_for_any to execute asynchronously functions and wait for the completion of all or any of them.
-
-* Some __AE__ and __ACT__ models
- * basic_threader: can be seen as a thread factory executing asynchronously a function on the returned thread.
- * launchers: Lanchers can be seen as a future factory executing asynchronously a function on a hiden thread.
- * threader/joiner: A Threader runs a unary function in its own thread. A Threader can be seen as a Joiner
- factory executing asynchronously a function on a thread encapsulated on the returned Joiner. The joiner is used
- to synchronise with and pick up the result from a function or to manage the encapsulated thread.
- * __tp_pool__ and __tp_task__ customization as an __AE__ and an __ACT__ respectively. __tp_pool__ can be seen as
- a __tp_task__ factory executing asynchronously a function on a pool of threads.
- * a generic asynchronous_executor_decorator which allows to decorate the function to be evaluated asynchronously.
-
-* Some thread extension
- * A thread_decoration class allowing to define setup/cleanup functions which will be called only once by thread (if
+* A thread_decoration class allowing to define setup/cleanup functions which will be called only once by thread (if
the thread function is decorated with thread_decorator): setup before the thread function and cleanup at thread exit.
It is used together with asynchronous_executor_decorator
- * A thread_decorator/thread_decorate class/function which decorate a thread function in order to call the setup and the
+* A thread_decorator/thread_decorate class/function which decorate a thread function in order to call the setup and the
cleanup of all the thread_decorations.
- * A thread specific shared pointer which is an extension of the thread_specific_ptr providing access
+* A thread specific shared pointer which is an extension of the thread_specific_ptr providing access
to this thread specific context from other threads.
As it is shared the stored pointer is a shared_ptr instead of a raw one.
- * A thread keep alive mechanism: this mechanism allows to detect threads that do not prove that they are alive by
+* A thread keep alive mechanism: this mechanism allows to detect threads that do not prove that they are alive by
calling to the keep_alive_point regularly.
When a thread is declared dead a user provided function is called, which by default will abort the program.
@@ -59,13 +41,9 @@
* thread_group_once: an extension of the boost::thread_group which allows to join the completion of any thread in the group using for that the set_once synchronizer.
+[note thread_decorator and thread_specific_shared_ptr are based on the original implementation of [@http://www.boost-consulting.com/vault/index.php?directory=Concurrent%20Programming [*threadalert]]
+written by Roland Schwarz.]
-References
-
-* thread_decorator and thread_specific_shared_ptr are based on the original implementation of [@http://www.boost-consulting.com/vault/index.php?directory=Concurrent%20Programming [*threadalert]]
-written by Roland Schwarz.
-
-* threader/joiner are based on the original idea of Kevlin Henney [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf N1833 - Preliminary Threading Library Proposal for TR2]
[/====================================]
Modified: sandbox/interthreads/libs/interthreads/doc/rationale.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/rationale.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/rationale.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -49,9 +49,9 @@
```
]]
-[[Mimic shared_ptr] [From the point of the other threads thread_specific_shared_ptr behaves as a shared_ptr lockup.
+[[Mimic shared_ptr] [From the point of view of the other threads thread_specific_shared_ptr behaves as a shared_ptr lockup.
From the point of view of the current thread the stored pointer is located in a shared_pointer, so we can use the shared_ptr deleter feature
-From it we takes:
+From shared_ptr takes:
```T* get() const;
T* operator->() const;
Modified: sandbox/interthreads/libs/interthreads/doc/reference.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/reference.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/reference.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -20,82 +20,6 @@
[endsect]
-[section AE/ACT Framework Reference]
-
-[include reference/act_traits.qbk]
-
-[section AE operations]
-
-[include reference/fork.qbk]
-[include reference/fork_after.qbk]
-[include reference/fork_all.qbk]
-[include reference/wait_for_all.qbk]
-[include reference/wait_for_any.qbk]
-
-[endsect]
-
-[include reference/algorithm.qbk]
-
-[section Future based ACT operations]
-[include reference/wait.qbk]
-[include reference/wait_until.qbk]
-[include reference/get.qbk]
-[include reference/is_ready.qbk]
-[include reference/has_value.qbk]
-[include reference/has_exception.qbk]
-
-[include reference/wait_all.qbk]
-[include reference/wait_all_until.qbk]
-[include reference/get_all.qbk]
-[include reference/are_all_ready.qbk]
-[include reference/have_all_value.qbk]
-[include reference/have_all_exception.qbk]
-
-[endsect]
-
-[section Thread based ACT operations]
-
-[include reference/detach.qbk]
-[include reference/joinable.qbk]
-[include reference/join.qbk]
-[include reference/join_until.qbk]
-[include reference/interrupt.qbk]
-[include reference/interruption_requested.qbk]
-
-
-[include reference/detach_all.qbk]
-[include reference/join_all.qbk]
-[include reference/are_all_joinable.qbk]
-[include reference/join_all_until.qbk]
-[include reference/interrupt_all.qbk]
-[include reference/interruption_requested_all.qbk]
-[endsect]
-
-
-[endsect]
-
-[section AE/ACT Models Reference]
-
-[include reference/basic_threader.qbk]
-[include reference/launcher.qbk]
-[include reference/threader.qbk]
-[include reference/scheduler.qbk]
-
-[include reference/typeof/futures.qbk]
-[include reference/typeof/launcher.qbk]
-[include reference/typeof/threader.qbk]
-[include reference/typeof/basic_threader.qbk]
-[include reference/typeof/scheduler.qbk]
-
-[include reference/asynchronous_executor_decorator.qbk]
-[include reference/basic_threader_decorator.qbk]
-[include reference/threader_decorator.qbk]
-[include reference/launcher_decorator.qbk]
-
-[/include reference/asynchronous_adapter.qbk]
-
-[endsect]
-
[section Thread Array Reference]
[include reference/set_once.qbk]
Modified: sandbox/interthreads/libs/interthreads/doc/reference/thread_decorator.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/reference/thread_decorator.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/reference/thread_decorator.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -55,15 +55,15 @@
Objects of type `thread_decorator` are movable, so they can be stored in move-aware containers, and returned from functions.
This allows the details of thread decoration to be wrapped in a function.
-thread_decorator make_decorator();
+ thread_decorator make_decorator();
-void f()
-{
- boot::thread some_thread(make_decorator());
- some_thread.join();
-}
+ void f()
+ {
+ boot::thread some_thread(make_decorator());
+ some_thread.join();
+ }
-[note On compilers that support rvalue references, `thread_decorator` provides a proper move constructor and move-assignment operator,
+[note On compilers that support rvalue references, `thread_decorator` will provides a proper move constructor and move-assignment operator,
and therefore meets the C++0x `MoveConstructible` and `MoveAssignable` concepts. With such compilers, `thread_decorator` can therefore
be used with containers that support those concepts.
@@ -110,8 +110,12 @@
[[Thread safety:][safe]]
+[[Limitations:][The current implementation defines overloads up to four parameters.]]
+
]
+
+
[endsect]
[section:decorator_thread_decoration_decorate_copy_move_constructor Copy Move Constructor]
@@ -232,7 +236,7 @@
[[Throws:] [Any exception thrown by the decorations or the user function.]]
-[[Thread safety:][unsafe - depends on the decorations constructio/destruction.]]
+[[Thread safety:][unsafe - depends on the decorations construction/destruction.]]
]
@@ -257,7 +261,7 @@
[[Throws:] [Any exception thrown by the decorations.]]
-[[Thread safety:][unsafe - depends on the decorations constructio/destruction.]]
+[[Thread safety:][unsafe - depends on the decorations construction/destruction.]]
]
Modified: sandbox/interthreads/libs/interthreads/doc/reference/thread_keep_alive.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/reference/thread_keep_alive.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/reference/thread_keep_alive.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -8,6 +8,8 @@
[section:keep_alive_file_hpp Header `<boost/interthreads/thread_keep_alive.hpp>`]
[/==========================================================================================]
+Includes the keep alive enabling/disabling classes and non member functions.
+
namespace boost {
namespace interthreads {
namespace this_thread {
@@ -25,6 +27,8 @@
[section:enable_keep_alive class `enable_keep_alive`]
[/==========================================================================================]
+Keep alive enabler.
+
class enable_keep_alive : private noncopyable{
public:
enable_keep_alive(std::size_t threshold=2, std::size_t tap=1);
@@ -65,6 +69,8 @@
[section:keep_alive_disable_keep_alive class `disable_keep_alive`]
[/==========================================================================================]
+Keep alive disabler.
+
class disable_keep_alive private noncopyable {
public:
disable_keep_alive();
@@ -105,6 +111,8 @@
[section:keep_alive_keep_alive_check_point Non Member Function `keep_alive_check_point()`]
[/==========================================================================================]
+Keep alive check point.
+
void keep_alive_check_point();
[variablelist
@@ -120,6 +128,8 @@
[section:keep_alive_keep_alive_enabled Non Member Function `keep_alive_enabled()`]
[/==========================================================================================]
+Keep alive query.
+
bool keep_alive_enabled();
[variablelist
@@ -134,6 +144,8 @@
[section:keep_alive_keep_alive_set_on_dead_thread Non Member Function `set_on_dead_thread()`]
[/==========================================================================================]
+Keep alive on dead thread action setting.
+
void set_on_dead_thread(on_dead_thread_type fct);
[variablelist
Modified: sandbox/interthreads/libs/interthreads/doc/reference/thread_specific_shared_ptr.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/reference/thread_specific_shared_ptr.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/reference/thread_specific_shared_ptr.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -22,7 +22,7 @@
[/==========================================================================================]
`bith::thread_specific_shared_ptr<>` is an extension of the thread_specific_ptr providing access
-to this thread specific context from other threads.
+to the thread specific context from other threads.
template <typename T>
class thread_specific_shared_ptr : private noncopyable
@@ -121,7 +121,7 @@
[variablelist
-[[Effects:] [Remove from the map the current thread::id and destroys `*this`.]]
+[[Effects:] [Remove from the static map the current thread::id and destroys `*this`.]]
[[Throws:] [Nothing.]]
@@ -150,7 +150,7 @@
]
-[note The initial value associated with an instance of `boost::thread_specific_shared_ptr<>` is `NULL` for each thread.]
+[note The initial value associated with an instance of `boost::thread_specific_shared_ptr<>` is `0` for each thread.]
[endsect]
@@ -161,7 +161,7 @@
[variablelist
-[[Requires:] [`this->get()` is not `NULL`.]]
+[[Requires:] [`this->get()` is not `0`.]]
[[Returns:] [`this->get()`]]
@@ -180,7 +180,7 @@
[variablelist
-[[Requires:] [`this->get()` is not `NULL`.]]
+[[Requires:] [`this->get()` is not `0`.]]
[[Returns:] [`*(this->get())`]]
@@ -237,7 +237,6 @@
[[Effects:] [If `this->get()!=new_value` and `this->get()` is non-`NULL`, invoke `delete this->get()` or
`deleter(this->get())` as appropriate. Store `new_value` as the pointer associated with the current thread.]]
-[[Throws:] [`std::bad_alloc` when resources unavailable.]]
]
Modified: sandbox/interthreads/libs/interthreads/doc/tests.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/tests.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/tests.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -8,46 +8,8 @@
[section:tests Appendix E: Tests]
-[section AE/ACT]
+[section thread_specific_shared_pointer]
[table
- [[Name] [Description] [Pool] [BaTh][ShLa][ShTh][UnLa][UnLa] [Ticket]]
- [[do_test_member_fork] [Forks and get] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_member_fork_m] [Forks and get] [????] [Pass][Pass][????][????][????] [#]]
- [[do_test_member_fork_bind] [Forks and get] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_member_fork_bind_m] [Forks and get] [????] [????][Pass][????][????][????] [#]]
- [[do_test_fork] [Forks a nullary function and get] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_fork_1] [Forks a unary function and get] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_fork_1_m] [Forks a unary function and get] [????] [????][Pass][????][????][????] [#]]
- [[do_test_creation_through_functor] [Forks a functor] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_creation_through_reference_wrapper] [Forks a reference wrapper] [Pass] [????][Pass][Pass][????][????] [#]]
-
-
- [[do_test_wait] [Forks and waits] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_wait_until] [Forks and waits until a given time] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_wait_for] [Forks and waits for a given time] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_get] [Forks and get ] [????] [----][Pass][????][????][????] [#]]
- [[do_test_wait_all] [Forks several and waits all] [Pass] [----][Pass][Pass][????][????] [#]]
- [[do_test_wait_all_until] [Forks several and waits all until a given time] [????] [----][Pass][Pass][????][????] [#]]
- [[do_test_wait_all_for] [Forks several and waits all for a given time] [????] [----][????][????][????][????] [#]]
- [[do_test_set_all] [Forks several and get all using set_all] [Pass] [----][Pass][Pass][????][????] [#]]
- [[do_test_get_all] [Forks several and get all] [Pass] [----][Fail][Pass][????][????] [#]]
- [[do_test_wait_for_all] [wait for all] [Pass] [----][Pass][Pass][????][????] [#]]
- [[do_test_wait_for_any] [waits for any] [Fail] [----][Pass][Pass][????][????] [#]]
- [[do_test_wait_for_any_fusion_sequence] [Wait for any in a fusion sequence] [Fail] [????][????][Pass][????][????] [#]]
-
- [[do_test_member_fork_detach] [Forks and detach] [Fail] [????][----][Pass][????][????] [#]]
- [[do_test_thread_interrupts_at_interruption_point] [Interrupt] [Pass] [????][----][Pass][????][????] [#]]
- [[do_test_join] [Forks and join] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_join_until] [Forks and joins until a given time] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_join_for] [Forks and joins for a given time] [Pass] [Pass][Pass][Pass][????][????] [#]]
- [[do_test_join_all] [Forks several and join all] [Pass] [----][Pass][Pass][????][????] [#]]
- [[do_test_join_all_until] [Forks several and join all until a given time] [????] [----][????][????][????][????] [#]]
- [[do_test_join_all_for] [Forks several and join all for a given time] [????] [----][????][????][????][????] [#]]
-
- [[do_test_fork_after_join] [Fork after some dependent ACT and then join] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_fork_after_wait] [Fork after some dependent ACT and then wait] [Pass] [????][Pass][Pass][????][????] [#]]
- [[do_test_fork_after_get] [Fork after some dependent ACT and then get the value] [Pass] [????][Pass][Pass][????][????] [#]]
- [[XXXXXXXXXXXXXXXXXXXXXX] [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] [XXXX] [????][????][????][????][????] [#]]
]
Modified: sandbox/interthreads/libs/interthreads/doc/tickets.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/tickets.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/tickets.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -21,59 +21,7 @@
]
[
[bug]
- [v0.2#1]
- [ae::get_all do not work yet]
- [get_all do not work because fusion transform sequence function can not take non const sequences.
-I have emulated it using set_all and a transformation for a tuple of ACT to a tuple of result_type.
-]
- [Closed]
- [do_test_get_all]
- [v0.4]
-]
-[
- [bug]
- [v0.2#2]
- [Some trouble with the use of tp::pool directly, use scheduler instead]
- [Four issues.
-* The parameter to fork on tp:pool was a const F& instead of a F.
-* Direct use of fork_all resolved for the other AE by ADL, which could not be the case fro the tp::pool.
-* fork specialization for tp::pool incorrent.
-* use of the default handle instead of asynchronous_completion_token traits class]
- [Closed]
- [See tp_pool test suite]
- [v0.3.1]
-]
-
-[
- [bug]
- [v0.3#1]
- [scheduler::do_test_wait_for_any do not work yet]
- [Not reproductible]
- [Closed]
- [scheduler::do_test_wait_for_any]
- [v0.3.1]
-]
-[
- [bug]
- [v0.3#2]
- [scheduler::do_test_fork_after_get do not work yet]
- [To solve this issue it enough to define boost::move for tp::task]
- [Closed]
- [scheduler::do_test_fork_after_get]
- [v0.3.1]
-]
-[
- [bug]
- [v0.3#3]
- [scheduler::do_test_fork_after_wait do not work yet]
- [To solve this issue it enough to define boost::move for tp::task]
- [Closed]
- [scheduler::do_test_fork_after_wait]
- [v0.3.1]
-]
-[
- [bug]
- [v0.3.1#1]
+ [v0.1.1#1]
[keep alive mechanism crash when setting set_on_dead_thread before enabling the mechanism]
[This was due to the fact that there were no default data for the backup.]
[Closed]
@@ -82,7 +30,7 @@
]
[
[bug]
- [v0.3.1#2]
+ [v0.1.1#2]
[keep alive mechanism do not detect dead threads]
[We need to reset the counters only when the period is 0.]
[Closed]
@@ -91,7 +39,7 @@
]
[
[bug]
- [v0.3.1#3]
+ [v0.1.1#3]
[The set_on_dead_thread setting is not recovered by embeeding enablers/disablers]
[The problem is that the on_dead and th thread pointer were stored on the backup. It is enough to store them on the ]
[Closed]
@@ -100,7 +48,7 @@
]
[
[bug]
- [v0.4.0#1]
+ [v0.2.0#1]
[xxx]
[xx]
[Open]
Modified: sandbox/interthreads/libs/interthreads/doc/tutorial.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/tutorial.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/tutorial.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -688,9 +688,5 @@
[endsect]
[endsect]
-[section AE/ACT framework]
-[endsect]
-
-
[endsect]
\ No newline at end of file
Modified: sandbox/interthreads/libs/interthreads/doc/users_guide.qbk
==============================================================================
--- sandbox/interthreads/libs/interthreads/doc/users_guide.qbk (original)
+++ sandbox/interthreads/libs/interthreads/doc/users_guide.qbk 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -18,22 +18,8 @@
[section:bibliography References]
[/==============================]
-[/
-[variablelist
-[[boost::call_once] [Boost.Thread implementation for call_once.]]
-[[boost::this_thread::at_thread_exit] [Boost.Thread implementation for at thread exit cleanup registration.]]
-[[boost::thread_specific_ptr] [Boost.Thread implementation for TSS.]]
-[[boost::thread_group] [Boost.Thread thread_group.]]
-]
-]
[variablelist
-[[[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf N1833 - Preliminary Threading Library Proposal for TR2]] []]
-[[[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2185.html N2185 - Proposed Text for Parallel Task Execution]] []]
-[[[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2276.html N2276 - Thread Pools and Futures]] []]
-[[[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2802.html N2802: A plea to reconsider detach-on-destruction for thread objects] ] []]
-[[[@http://www.boostpro.com/vault/index.php?action=downloadfile&filename=boost-threadpool.3.tar.gz&directory=Concurrent%20Programming& Boost.ThreadPool (O. Kowalke)]] []]
-[[[@http://www.justsoftwaresolutions.co.uk/threading/free-implementation-of-c++-futures.html Boost.Futures (A. Williams)]] []]
[[[@http://www.boost.org/libs/thread Boost.Thread (A. Williams)]] []]
]
@@ -48,8 +34,6 @@
[variablelist
-[[AE] [Asynchronous executor]]
-[[ACT] [Asynchronous completion token]]
[[alive (thread)] [a thread is considered alive when not dead.]]
[[cleanup decoration] [function called at thread exit.]]
[[dead (thread)] [a thread is considered dead when has not done enough keep alive check points for a given duration.]]
@@ -60,7 +44,6 @@
[[setup decoration] [function called before the thread starts.]]
[[TSS] [Thread Specific Storage.]]
[[TSSS] [Thread Specific Shared Storage.]]
-[[tuple (thread)] [group of threads statically determined and launched at construction time.]]
]
[endsect]
Modified: sandbox/interthreads/libs/interthreads/test/Jamfile.v2
==============================================================================
--- sandbox/interthreads/libs/interthreads/test/Jamfile.v2 (original)
+++ sandbox/interthreads/libs/interthreads/test/Jamfile.v2 2009-10-12 17:42:26 EDT (Mon, 12 Oct 2009)
@@ -21,15 +21,13 @@
project
: requirements
-# <library>/boost/test//boost_unit_test_framework/<link>static
-# <library>/boost/thread//boost_thread/<link>static
- <library>/boost_1_39_0/libs/test/build//boost_unit_test_framework/<link>static
- <library>/boost_1_39_0/libs/thread/build//boost_thread/<link>static
+ <library>/boost/test//boost_unit_test_framework/<link>static
+ <library>/boost/thread//boost_thread/<link>static
#<library>../build//boost_interthreads/<link>static
+ #<library>/sandbox/interthreads/libs/interthreads/build//boost_interthreads/<link>static
- <include>.
<include>../../..
- <include>/boost_1_39_0
+ <include>$(BOOST_ROOT)
<threading>multi
# <target-os>cygwin
# <interthreadapi>pthread
@@ -41,7 +39,8 @@
rule interthreads-run ( sources * )
{
return
- [ run $(sources) ../build//boost_interthreads : : : <link>static ]
+ [ run $(sources) ../build//boost_interthreads/<link>static : : : ]
+ #[ run $(sources) : : : ]
# [ run $(sources) ../../../../libs/thread/build//boost_thread : : : : $(sources[1]:B)_lib ]
;
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk