File: overview.xml

package info (click to toggle)
boost 1.33.1-10
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 100,948 kB
  • ctags: 145,103
  • sloc: cpp: 573,492; xml: 49,055; python: 15,626; ansic: 13,588; sh: 2,099; yacc: 858; makefile: 660; perl: 427; lex: 111; csh: 6
file content (202 lines) | stat: -rw-r--r-- 9,523 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
  "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd" [
  <!ENTITY % threads.entities SYSTEM "entities.xml">
  %threads.entities;
]>
<section id="threads.overview" last-revision="$Date: 2004/07/17 04:33:59 $">
  <title>Overview</title>
  <section id="threads.introduction">
    <title>Introduction</title>
    <para>&Boost.Threads; allows C++ programs to execute as multiple,
    asynchronous, independent threads-of-execution. Each thread has its own
    machine state including program instruction counter and registers. Programs
    which execute as multiple threads are called multithreaded programs to
    distinguish them from traditional single-threaded programs. The <link
	linkend="threads.glossary">glossary</link> gives a more complete description
	of the multithreading execution environment.</para>
    <para>Multithreading provides several advantages:
    <itemizedlist>
      <listitem>
        <para>Programs which would otherwise block waiting for some external
        event can continue to respond if the blocking operation is placed in a
        separate thread. Multithreading is usually an absolute requirement for
        these programs.</para>
      </listitem>
      <listitem>
        <para>Well-designed multithreaded programs may execute faster than
        single-threaded programs, particularly on multiprocessor hardware.
        Note, however, that poorly-designed multithreaded programs are often
        slower than single-threaded programs.</para>
      </listitem>
      <listitem>
        <para>Some program designs may be easier to formulate using a
        multithreaded approach. After all, the real world is
        asynchronous!</para>
      </listitem>
    </itemizedlist></para>
  </section>
  <section>
    <title>Dangers</title>
    <section>
    <title>General considerations</title>
    <para>Beyond the errors which can occur in single-threaded programs,
    multithreaded programs are subject to additional errors:
    <itemizedlist>
      <listitem>
        <para><link linkend="threads.glossary.race-condition">Race
	    conditions</link></para>
      </listitem>
      <listitem>
        <para><link linkend="threads.glossary.deadlock">Deadlock</link>
        (sometimes called "deadly embrace")</para>
      </listitem>
      <listitem>
        <para><link linkend="threads.glossary.priority-failure">Priority
        failures</link> (priority inversion, infinite overtaking, starvation,
		etc.)</para>
      </listitem>
    </itemizedlist></para>
    <para>Every multithreaded program must be designed carefully to avoid these
	errors. These aren't rare or exotic failures - they are virtually guaranteed
	to occur unless multithreaded code is designed to avoid them. Priority
	failures are somewhat less common, but are nonetheless serious.</para>
    <para>The <link linkend="threads.design">&Boost.Threads; design</link>
    attempts to minimize these errors, but they will still occur unless the
    programmer proactively designs to avoid them.</para>
	<note>Please also see <xref linkend="threads.implementation_notes"/>
	for additional, implementation-specific considerations.</note>
	</section>
    <section>
      <title>Testing and debugging considerations</title>
      <para>Multithreaded programs are non-deterministic. In other words, the
      same program with the same input data may follow different execution
      paths each time it is invoked. That can make testing and debugging a
      nightmare:
      <itemizedlist>
        <listitem>
          <para>Failures are often not repeatable.</para>
        </listitem>
        <listitem>
          <para>Probe effect causes debuggers to produce very different results
          from non-debug uses.</para>
        </listitem>
        <listitem>
          <para>Debuggers require special support to show thread state.</para>
        </listitem>
        <listitem>
          <para>Tests on a single processor system may give no indication of
          serious errors which would appear on multiprocessor systems, and visa
          versa. Thus test cases should include a varying number of
          processors.</para>
        </listitem>
        <listitem>
          <para>For programs which create a varying number of threads according
          to workload, tests which don't span the full range of possibilities
          may miss serious errors.</para>
        </listitem>
      </itemizedlist></para>
    </section>
    <section>
      <title>Getting a head start</title>
      <para>Although it might appear that multithreaded programs are inherently
      unreliable, many reliable multithreaded programs do exist. Multithreading
      techniques are known which lead to reliable programs.</para>
      <para>Design patterns for reliable multithreaded programs, including the
      important <emphasis>monitor</emphasis> pattern, are presented in 
      <emphasis>Pattern-Oriented Software Architecture Volume 2 - Patterns for
      Concurrent and Networked Objects</emphasis>
	  &cite.SchmidtStalRohnertBuschmann;. Many important multithreading programming
	  considerations (independent of threading library) are discussed in
	  <emphasis>Programming with POSIX Threads</emphasis> &cite.Butenhof97;.</para>
      <para>Doing some reading before attempting multithreaded designs will
      give you a head start toward reliable multithreaded programs.</para>
    </section>
  </section>
  <section>
    <title>C++ Standard Library usage in multithreaded programs</title>
    <section>
      <title>Runtime libraries</title>
      <para>
      <emphasis role="bold">Warning:</emphasis> Multithreaded programs such as
	  those using &Boost.Threads; must link to <link
	  linkend="threads.glossary.thread-safe">thread-safe</link> versions of
	  all runtime libraries used by the program, including the runtime library
	  for the C++ Standard Library. Failure to do so will cause <link
	  linkend="threads.glossary.race-condition">race conditions</link> to occur
	  when multiple threads simultaneously execute runtime library functions for
	  <code>new</code>, <code>delete</code>, or other language features which
	  imply shared state.</para>
    </section>
    <section>
      <title>Potentially non-thread-safe functions</title>
      <para>Certain C++ Standard Library functions inherited from C are
      particular problems because they hold internal state between
      calls:
      <itemizedlist>
        <listitem>
          <para><code>rand</code></para>
        </listitem>
        <listitem>
          <para><code>strtok</code></para>
        </listitem>
        <listitem>
          <para><code>asctime</code></para>
        </listitem>
        <listitem>
          <para><code>ctime</code></para>
        </listitem>
        <listitem>
          <para><code>gmtime</code></para>
        </listitem>
        <listitem>
          <para><code>localtime</code></para>
        </listitem>
      </itemizedlist></para>
      <para>It is possible to write thread-safe implementations of these by
      using thread specific storage (see
	  <classname>boost::thread_specific_ptr</classname>), and several C++ 
	  compiler vendors do just that. The technique is well-know and is explained
	  in &cite.Butenhof97;.</para>
      <para>But at least one vendor (HP-UX) does not provide thread-safe
      implementations of the above functions in their otherwise thread-safe
      runtime library. Instead they provide replacement functions with
      different names and arguments.</para>
      <para><emphasis role="bold">Recommendation:</emphasis> For the most
	  portable, yet thread-safe code, use Boost replacements for the problem
	  functions. See the <libraryname>Boost Random Number Library</libraryname>
	  and <libraryname>Boost Tokenizer Library</libraryname>.</para>
    </section>
  </section>
  <section>
    <title>Common guarantees for all &Boost.Threads; components</title>
    <section>
      <title>Exceptions</title>
      <para>&Boost.Threads; destructors never
	  throw exceptions. Unless otherwise specified, other
	  &Boost.Threads; functions that do not have
	  an exception-specification may throw implementation-defined
	  exceptions.</para>
      <para>In particular, &Boost.Threads;
	  reports failure to allocate storage by throwing an exception of type
	  <code>std::bad_alloc</code> or a class derived from
	  <code>std::bad_alloc</code>, failure to obtain thread resources other than
	  memory by throwing an exception of type
	  <classname>boost::thread_resource_error</classname>, and certain lock
	  related failures by throwing an exception of type
	  <classname>boost::lock_error</classname>.</para>
      <para><emphasis role="bold">Rationale:</emphasis> Follows the C++ Standard
	  Library practice of allowing all functions except destructors or other
	  specified functions to throw exceptions on errors.</para>
    </section>
    <section>
      <title>NonCopyable requirement</title>
      <para>&Boost.Threads; classes documented as
	  meeting the NonCopyable requirement disallow copy construction and copy
	  assignment. For the sake of exposition, the synopsis of such classes show
	  private derivation from <classname>boost::noncopyable</classname>. Users
	  should not depend on this derivation, however, as implementations are free
	  to meet the NonCopyable requirement in other ways.</para>
    </section>
  </section>
</section>