OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libpthread/] [linuxthreads/] [FAQ.html] - Blame information for rev 1779

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
<HTML>
2
<HEAD>
3
<TITLE>LinuxThreads Frequently Asked Questions</TITLE>
4
</HEAD>
5
<BODY>
6
<H1 ALIGN=center>LinuxThreads Frequently Asked Questions <BR>
7
                 (with answers)</H1>
8
<H2 ALIGN=center>[For LinuxThreads version 0.8]</H2>
9
 
10
<HR><P>
11
 
12
<A HREF="#A">A. The big picture</A><BR>
13
<A HREF="#B">B. Getting more information</A><BR>
14
<A HREF="#C">C. Issues related to the C library</A><BR>
15
<A HREF="#D">D. Problems, weird behaviors, potential bugs</A><BR>
16
<A HREF="#E">E. Missing functions, wrong types, etc</A><BR>
17
<A HREF="#F">F. C++ issues</A><BR>
18
<A HREF="#G">G. Debugging LinuxThreads programs</A><BR>
19
<A HREF="#H">H. Compiling multithreaded code; errno madness</A><BR>
20
<A HREF="#I">I. X-Windows and other libraries</A><BR>
21
<A HREF="#J">J. Signals and threads</A><BR>
22
<A HREF="#K">K. Internals of LinuxThreads</A><P>
23
 
24
<HR>
25
<P>
26
 
27
<H2><A NAME="A">A. The big picture</A></H2>
28
 
29
<H4><A NAME="A.1">A.1: What is LinuxThreads?</A></H4>
30
 
31
LinuxThreads is a Linux library for multi-threaded programming.
32
It implements the Posix 1003.1c API (Application Programming
33
Interface) for threads.  It runs on any Linux system with kernel 2.0.0
34
or more recent, and a suitable C library (see section <A HREF="C">C</A>).
35
<P>
36
 
37
<H4><A NAME="A.2">A.2: What are threads?</A></H4>
38
 
39
A thread is a sequential flow of control through a program.
40
Multi-threaded programming is, thus, a form of parallel programming
41
where several threads of control are executing concurrently in the
42
program.  All threads execute in the same memory space, and can
43
therefore work concurrently on shared data.<P>
44
 
45
Multi-threaded programming differs from Unix-style multi-processing in
46
that all threads share the same memory space (and a few other system
47
resources, such as file descriptors), instead of running in their own
48
memory space as is the case with Unix processes.<P>
49
 
50
Threads are useful for two reasons.  First, they allow a program to
51
exploit multi-processor machines: the threads can run in parallel on
52
several processors, allowing a single program to divide its work
53
between several processors, thus running faster than a single-threaded
54
program, which runs on only one processor at a time.  Second, some
55
programs are best expressed as several threads of control that
56
communicate together, rather than as one big monolithic sequential
57
program.  Examples include server programs, overlapping asynchronous
58
I/O, and graphical user interfaces.<P>
59
 
60
<H4><A NAME="A.3">A.3: What is POSIX 1003.1c?</A></H4>
61
 
62
It's an API for multi-threaded programming standardized by IEEE as
63
part of the POSIX standards.  Most Unix vendors have endorsed the
64
POSIX 1003.1c standard.  Implementations of the 1003.1c API are
65
already available under Sun Solaris 2.5, Digital Unix 4.0,
66
Silicon Graphics IRIX 6, and should soon be available from other
67
vendors such as IBM and HP.  More generally, the 1003.1c API is
68
replacing relatively quickly the proprietary threads library that were
69
developed previously under Unix, such as Mach cthreads, Solaris
70
threads, and IRIX sprocs.  Thus, multithreaded programs using the
71
1003.1c API are likely to run unchanged on a wide variety of Unix
72
platforms.<P>
73
 
74
<H4><A NAME="A.4">A.4: What is the status of LinuxThreads?</A></H4>
75
 
76
LinuxThreads implements almost all of Posix 1003.1c, as well as a few
77
extensions.  The only part of LinuxThreads that does not conform yet
78
to Posix is signal handling (see section <A HREF="#J">J</A>).  Apart
79
from the signal stuff, all the Posix 1003.1c base functionality,
80
as well as a number of optional extensions, are provided and conform
81
to the standard (to the best of my knowledge).
82
The signal stuff is hard to get right, at least without special kernel
83
support, and while I'm definitely looking at ways to implement the
84
Posix behavior for signals, this might take a long time before it's
85
completed.<P>
86
 
87
<H4><A NAME="A.5">A.5: How stable is LinuxThreads?</A></H4>
88
 
89
The basic functionality (thread creation and termination, mutexes,
90
conditions, semaphores) is very stable.  Several industrial-strength
91
programs, such as the AOL multithreaded Web server, use LinuxThreads
92
and seem quite happy about it.  There used to be some rough edges in
93
the LinuxThreads / C library interface with libc 5, but glibc 2
94
fixes all of those problems and is now the standard C library on major
95
Linux distributions (see section <A HREF="#C">C</A>). <P>
96
 
97
<HR>
98
<P>
99
 
100
<H2><A NAME="B">B.  Getting more information</A></H2>
101
 
102
<H4><A NAME="B.1">B.1: What are good books and other sources of
103
information on POSIX threads?</A></H4>
104
 
105
The FAQ for comp.programming.threads lists several books:
106
<A HREF="http://www.serpentine.com/~bos/threads-faq/">http://www.serpentine.com/~bos/threads-faq/</A>.<P>
107
 
108
There are also some online tutorials. Follow the links from the
109
LinuxThreads web page:
110
<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads">http://pauillac.inria.fr/~xleroy/linuxthreads</A>.<P>
111
 
112
<H4><A NAME="B.2">B.2: I'd like to be informed of future developments on
113
LinuxThreads. Is there a mailing list for this purpose?</A></H4>
114
 
115
I post LinuxThreads-related announcements on the newsgroup
116
<A HREF="news:comp.os.linux.announce">comp.os.linux.announce</A>,
117
and also on the mailing list
118
<code>linux-threads@magenet.com</code>.
119
You can subscribe to the latter by writing
120
<A HREF="mailto:majordomo@magenet.com">majordomo@magenet.com</A>.<P>
121
 
122
<H4><A NAME="B.3">B.3: What are good places for discussing
123
LinuxThreads?</A></H4>
124
 
125
For questions about programming with POSIX threads in general, use
126
the newsgroup
127
<A HREF="news:comp.programming.threads">comp.programming.threads</A>.
128
Be sure you read the
129
<A HREF="http://www.serpentine.com/~bos/threads-faq/">FAQ</A>
130
for this group before you post.<P>
131
 
132
For Linux-specific questions, use
133
<A
134
HREF="news:comp.os.linux.development.apps">comp.os.linux.development.apps</A>
135
and <A
136
HREF="news:comp.os.linux.development.kernel">comp.os.linux.development.kernel</A>.
137
The latter is especially appropriate for questions relative to the
138
interface between the kernel and LinuxThreads.<P>
139
 
140
<H4><A NAME="B.4">B.4: How should I report a possible bug in
141
LinuxThreads?</A></H4>
142
 
143
If you're using glibc 2, the best way by far is to use the
144
<code>glibcbug</code> script to mail a bug report to the glibc
145
maintainers. <P>
146
 
147
If you're using an older libc, or don't have the <code>glibcbug</code>
148
script on your machine, then e-mail me directly
149
(<code>Xavier.Leroy@inria.fr</code>).  <P>
150
 
151
In both cases, before sending the bug report, make sure that it is not
152
addressed already in this FAQ.  Also, try to send a short program that
153
reproduces the weird behavior you observed. <P>
154
 
155
<H4><A NAME="B.5">B.5: I'd like to read the POSIX 1003.1c standard. Is
156
it available online?</A></H4>
157
 
158
Unfortunately, no.  POSIX standards are copyrighted by IEEE, and
159
IEEE does not distribute them freely.  You can buy paper copies from
160
IEEE, but the price is fairly high ($120 or so). If you disagree with
161
this policy and you're an IEEE member, be sure to let them know.<P>
162
 
163
On the other hand, you probably don't want to read the standard.  It's
164
very hard to read, written in standard-ese, and targeted to
165
implementors who already know threads inside-out.  A good book on
166
POSIX threads provides the same information in a much more readable form.
167
I can personally recommend Dave Butenhof's book, <CITE>Programming
168
with POSIX threads</CITE> (Addison-Wesley). Butenhof was part of the
169
POSIX committee and also designed the Digital Unix implementations of
170
POSIX threads, and it shows.<P>
171
 
172
Another good source of information is the X/Open Group Single Unix
173
specification which is available both
174
<A HREF="http://www.rdg.opengroup.org/onlinepubs/7908799/index.html">on-line</A>
175
and as a
176
<A HREF="http://www.UNIX-systems.org/gosolo2/">book and CD/ROM</A>.
177
That specification includes pretty much all the POSIX standards,
178
including 1003.1c, with some extensions and clarifications.<P>
179
 
180
<HR>
181
<P>
182
 
183
<H2><A NAME="C">C.  Issues related to the C library</A></H2>
184
 
185
<H4><A NAME="C.1">C.1: Which version of the C library should I use
186
with LinuxThreads?</A></H4>
187
 
188
The best choice by far is glibc 2, a.k.a. libc 6.  It offers very good
189
support for multi-threading, and LinuxThreads has been closely
190
integrated with glibc 2.  The glibc 2 distribution contains the
191
sources of a specially adapted version of LinuxThreads.<P>
192
 
193
glibc 2 comes preinstalled as the default C library on several Linux
194
distributions, such as RedHat 5 and up, and Debian 2.
195
Those distributions include the version of LinuxThreads matching
196
glibc 2.<P>
197
 
198
<H4><A NAME="C.2">C.2: My system has libc 5 preinstalled, not glibc
199
2.  Can I still use LinuxThreads?</H4>
200
 
201
Yes, but you're likely to run into some problems, as libc 5 only
202
offers minimal support for threads and contains some bugs that affect
203
multithreaded programs. <P>
204
 
205
The versions of libc 5 that work best with LinuxThreads are
206
libc 5.2.18 on the one hand, and libc 5.4.12 or later on the other hand.
207
Avoid 5.3.12 and 5.4.7: these have problems with the per-thread errno
208
variable. <P>
209
 
210
<H4><A NAME="C.3">C.3: So, should I switch to glibc 2, or stay with a
211
recent libc 5?</A></H4>
212
 
213
I'd recommend you switch to glibc 2.  Even for single-threaded
214
programs, glibc 2 is more solid and more standard-conformant than libc
215
5.  And the shortcomings of libc 5 almost preclude any serious
216
multi-threaded programming.<P>
217
 
218
Switching an already installed
219
system from libc 5 to glibc 2 is not completely straightforward.
220
See the <A HREF="http://sunsite.unc.edu/LDP/HOWTO/Glibc2-HOWTO.html">Glibc2
221
HOWTO</A> for more information.  Much easier is (re-)installing a
222
Linux distribution based on glibc 2, such as RedHat 6.<P>
223
 
224
<H4><A NAME="C.4">C.4: Where can I find glibc 2 and the version of
225
LinuxThreads that goes with it?</A></H4>
226
 
227
On <code>prep.ai.mit.edu</code> and its many, many mirrors around the world.
228
See <A
229
HREF="http://www.gnu.org/order/ftp.html">http://www.gnu.org/order/ftp.html</A>
230
for a list of mirrors.<P>
231
 
232
<H4><A NAME="C.5">C.5: Where can I find libc 5 and the version of
233
LinuxThreads that goes with it?</A></H4>
234
 
235
For libc 5, see <A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/GCC/"><code>ftp://sunsite.unc.edu/pub/Linux/devel/GCC/</code></A>.<P>
236
 
237
For the libc 5 version of LinuxThreads, see
238
<A HREF="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/">ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/</A>.<P>
239
 
240
<H4><A NAME="C.6">C.6: How can I recompile the glibc 2 version of the
241
LinuxThreads sources?</A></H4>
242
 
243
You must transfer the whole glibc sources, then drop the LinuxThreads
244
sources in the <code>linuxthreads/</code> subdirectory, then recompile
245
glibc as a whole.  There are now too many inter-dependencies between
246
LinuxThreads and glibc 2 to allow separate re-compilation of LinuxThreads.
247
<P>
248
 
249
<H4><A NAME="C.7">C.7: What is the correspondence between LinuxThreads
250
version numbers, libc version numbers, and RedHat version
251
numbers?</A></H4>
252
 
253
Here is a summary. (Information on Linux distributions other than
254
RedHat are welcome.)<P>
255
 
256
<TABLE>
257
<TR><TD>LinuxThreads </TD> <TD>C library</TD> <TD>RedHat</TD></TR>
258
<TR><TD>0.7, 0.71 (for libc 5)</TD> <TD>libc 5.x</TD> <TD>RH 4.2</TD></TR>
259
<TR><TD>0.7, 0.71 (for glibc 2)</TD> <TD>glibc 2.0.x</TD> <TD>RH 5.x</TD></TR>
260
<TR><TD>0.8</TD> <TD>glibc 2.1.1</TD> <TD>RH 6.0</TD></TR>
261
<TR><TD>0.8</TD> <TD>glibc 2.1.2</TD> <TD>not yet released</TD></TR>
262
</TABLE>
263
<P>
264
 
265
<HR>
266
<P>
267
 
268
<H2><A NAME="D">D. Problems, weird behaviors, potential bugs</A></H2>
269
 
270
<H4><A NAME="D.1">D.1: When I compile LinuxThreads, I run into problems in
271
file <code>libc_r/dirent.c</code></A></H4>
272
 
273
You probably mean:
274
<PRE>
275
        libc_r/dirent.c:94: structure has no member named `dd_lock'
276
</PRE>
277
I haven't actually seen this problem, but several users reported it.
278
My understanding is that something is wrong in the include files of
279
your Linux installation (<code>/usr/include/*</code>). Make sure
280
you're using a supported version of the libc 5 library. (See question <A
281
HREF="#C.2">C.2</A>).<P>
282
 
283
<H4><A NAME="D.2">D.2: When I compile LinuxThreads, I run into problems with
284
<CODE>/usr/include/sched.h</CODE>: there are several occurrences of
285
<CODE>_p</CODE> that the C compiler does not understand</A></H4>
286
 
287
Yes, <CODE>/usr/include/sched.h</CODE> that comes with libc 5.3.12 is broken.
288
Replace it with the <code>sched.h</code> file contained in the
289
LinuxThreads distribution.  But really you should not be using libc
290
5.3.12 with LinuxThreads! (See question <A HREF="#C.2">C.1</A>.)<P>
291
 
292
<H4><A NAME="D.3">D.3: My program does <CODE>fdopen()</CODE> on a file
293
descriptor opened on a pipe.  When I link it with LinuxThreads,
294
<CODE>fdopen()</CODE> always returns NULL!</A></H4>
295
 
296
You're using one of the buggy versions of libc (5.3.12, 5.4.7., etc).
297
See question <A HREF="#C.1">C.1</A> above.<P>
298
 
299
<H4><A NAME="D.4">D.4: My program creates a lot of threads, and after
300
a while <CODE>pthread_create()</CODE> no longer returns!</A></H4>
301
 
302
This is known bug in the version of LinuxThreads that comes with glibc
303
2.1.1.  An upgrade to 2.1.2 is recommended. <P>
304
 
305
<H4><A NAME="D.5">D.5: When I'm running a program that creates N
306
threads, <code>top</code> or <code>ps</code>
307
display N+2 processes that are running my program. What do all these
308
processes correspond to?</A></H4>
309
 
310
Due to the general "one process per thread" model, there's one process
311
for the initial thread and N processes for the threads it created
312
using <CODE>pthread_create</CODE>.  That leaves one process
313
unaccounted for.  That extra process corresponds to the "thread
314
manager" thread, a thread created internally by LinuxThreads to handle
315
thread creation and thread termination.  This extra thread is asleep
316
most of the time.
317
 
318
<H4><A NAME="D.6">D.6: Scheduling seems to be very unfair when there
319
is strong contention on a mutex: instead of giving the mutex to each
320
thread in turn, it seems that it's almost always the same thread that
321
gets the mutex. Isn't this completely broken behavior?</A></H4>
322
 
323
That behavior has mostly disappeared in recent releases of
324
LinuxThreads (version 0.8 and up).  It was fairly common in older
325
releases, though.
326
 
327
What happens in LinuxThreads 0.7 and before is the following: when a
328
thread unlocks a mutex, all other threads that were waiting on the
329
mutex are sent a signal which makes them runnable.  However, the
330
kernel scheduler may or may not restart them immediately.  If the
331
thread that unlocked the mutex tries to lock it again immediately
332
afterwards, it is likely that it will succeed, because the threads
333
haven't yet restarted.  This results in an apparently very unfair
334
behavior, when the same thread repeatedly locks and unlocks the mutex,
335
while other threads can't lock the mutex.<P>
336
 
337
In LinuxThreads 0.8 and up, <code>pthread_unlock</code> restarts only
338
one waiting thread, and pre-assign the mutex to that thread.  Hence,
339
if the thread that unlocked the mutex tries to lock it again
340
immediately, it will block until other waiting threads have had a
341
chance to lock and unlock the mutex.  This results in much fairer
342
scheduling.<P>
343
 
344
Notice however that even the old "unfair" behavior is perfectly
345
acceptable with respect to the POSIX standard: for the default
346
scheduling policy, POSIX makes no guarantees of fairness, such as "the
347
thread waiting for the mutex for the longest time always acquires it
348
first".  Properly written multithreaded code avoids that kind of heavy
349
contention on mutexes, and does not run into fairness problems.  If
350
you need scheduling guarantees, you should consider using the
351
real-time scheduling policies <code>SCHED_RR</code> and
352
<code>SCHED_FIFO</code>, which have precisely defined scheduling
353
behaviors. <P>
354
 
355
<H4><A NAME="D.7">D.7: I have a simple test program with two threads
356
that do nothing but <CODE>printf()</CODE> in tight loops, and from the
357
printout it seems that only one thread is running, the other doesn't
358
print anything!</A></H4>
359
 
360
Again, this behavior is characteristic of old releases of LinuxThreads
361
(0.7 and before); more recent versions (0.8 and up) should not exhibit
362
this behavior.<P>
363
 
364
The reason for this behavior is explained in
365
question <A HREF="#D.6">D.6</A> above: <CODE>printf()</CODE> performs
366
locking on <CODE>stdout</CODE>, and thus your two threads contend very
367
heavily for the mutex associated with <CODE>stdout</CODE>.  But if you
368
do some real work between two calls to <CODE>printf()</CODE>, you'll
369
see that scheduling becomes much smoother.<P>
370
 
371
<H4><A NAME="D.8">D.8: I've looked at <code>&lt;pthread.h&gt;</code>
372
and there seems to be a gross error in the <code>pthread_cleanup_push</code>
373
macro: it opens a block with <code>{</code> but does not close it!
374
Surely you forgot a <code>}</code> at the end of the macro, right?
375
</A></H4>
376
 
377
Nope.  That's the way it should be.  The closing brace is provided by
378
the <code>pthread_cleanup_pop</code> macro.  The POSIX standard
379
requires <code>pthread_cleanup_push</code> and
380
<code>pthread_cleanup_pop</code> to be used in matching pairs, at the
381
same level of brace nesting.  This allows
382
<code>pthread_cleanup_push</code> to open a block in order to
383
stack-allocate some data structure, and
384
<code>pthread_cleanup_pop</code> to close that block.  It's ugly, but
385
it's the standard way of implementing cleanup handlers.<P>
386
 
387
<H4><A NAME="D.9">D.9: I tried to use real-time threads and my program
388
loops like crazy and freezes the whole machine!</A></H4>
389
 
390
Versions of LinuxThreads prior to 0.8 are susceptible to ``livelocks''
391
(one thread loops, consuming 100% of the CPU time) in conjunction with
392
real-time scheduling.  Since real-time threads and processes have
393
higher priority than normal Linux processes, all other processes on
394
the machine, including the shell, the X server, etc, cannot run and
395
the machine appears frozen.<P>
396
 
397
The problem is fixed in LinuxThreads 0.8.<P>
398
 
399
<H4><A NAME="D.10">D.10: My application needs to create thousands of
400
threads, or maybe even more.  Can I do this with
401
LinuxThreads?</A></H4>
402
 
403
No.  You're going to run into several hard limits:
404
<UL>
405
<LI>Each thread, from the kernel's standpoint, is one process.  Stock
406
Linux kernels are limited to at most 512 processes for the super-user,
407
and half this number for regular users.  This can be changed by
408
changing <code>NR_TASKS</code> in <code>include/linux/tasks.h</code>
409
and recompiling the kernel.  On the x86 processors at least,
410
architectural constraints seem to limit <code>NR_TASKS</code> to 4090
411
at most.
412
<LI>LinuxThreads contains a table of all active threads.  This table
413
has room for 1024 threads at most.  To increase this limit, you must
414
change <code>PTHREAD_THREADS_MAX</code> in the LinuxThreads sources
415
and recompile.
416
<LI>By default, each thread reserves 2M of virtual memory space for
417
its stack.  This space is just reserved; actual memory is allocated
418
for the stack on demand.  But still, on a 32-bit processor, the total
419
virtual memory space available for the stacks is on the order of 1G,
420
meaning that more than 500 threads will have a hard time fitting in.
421
You can overcome this limitation by moving to a 64-bit platform, or by
422
allocating smaller stacks yourself using the <code>setstackaddr</code>
423
attribute.
424
<LI>Finally, the Linux kernel contains many algorithms that run in
425
time proportional to the number of process table entries.  Increasing
426
this number drastically will slow down the kernel operations
427
noticeably.
428
</UL>
429
(Other POSIX threads libraries have similar limitations, by the way.)
430
For all those reasons, you'd better restructure your application so
431
that it doesn't need more than, say, 100 threads.  For instance,
432
in the case of a multithreaded server, instead of creating a new
433
thread for each connection, maintain a fixed-size pool of worker
434
threads that pick incoming connection requests from a queue.<P>
435
 
436
<HR>
437
<P>
438
 
439
<H2><A NAME="E">E. Missing functions, wrong types, etc</A></H2>
440
 
441
<H4><A NAME="E.1">E.1: Where is <CODE>pthread_yield()</CODE> ? How
442
comes LinuxThreads does not implement it?</A></H4>
443
 
444
Because it's not part of the (final) POSIX 1003.1c standard.
445
Several drafts of the standard contained <CODE>pthread_yield()</CODE>,
446
but then the POSIX guys discovered it was redundant with
447
<CODE>sched_yield()</CODE> and dropped it.  So, just use
448
<CODE>sched_yield()</CODE> instead.
449
 
450
<H4><A NAME="E.2">E.2: I've found some type errors in
451
<code>&lt;pthread.h&gt;</code>.
452
For instance, the second argument to <CODE>pthread_create()</CODE>
453
should be a <CODE>pthread_attr_t</CODE>, not a
454
<CODE>pthread_attr_t *</CODE>. Also, didn't you forget to declare
455
<CODE>pthread_attr_default</CODE>?</A></H4>
456
 
457
No, I didn't.  What you're describing is draft 4 of the POSIX
458
standard, which is used in OSF DCE threads.  LinuxThreads conforms to the
459
final standard.  Even though the functions have the same names as in
460
draft 4 and DCE, their calling conventions are slightly different.  In
461
particular, attributes are passed by reference, not by value, and
462
default attributes are denoted by the NULL pointer.  Since draft 4/DCE
463
will eventually disappear, you'd better port your program to use the
464
standard interface.<P>
465
 
466
<H4><A NAME="E.3">E.3: I'm porting an application from Solaris and I
467
have to rename all thread functions from <code>thr_blah</code> to
468
<CODE>pthread_blah</CODE>.  This is very annoying.  Why did you change
469
all the function names?</A></H4>
470
 
471
POSIX did it.  The <code>thr_*</code> functions correspond to Solaris
472
threads, an older thread interface that you'll find only under
473
Solaris.  The <CODE>pthread_*</CODE> functions correspond to POSIX
474
threads, an international standard available for many, many platforms.
475
Even Solaris 2.5 and later support the POSIX threads interface.  So,
476
do yourself a favor and rewrite your code to use POSIX threads: this
477
way, it will run unchanged under Linux, Solaris, and quite a lot of
478
other platforms.<P>
479
 
480
<H4><A NAME="E.4">E.4: How can I suspend and resume a thread from
481
another thread? Solaris has the <CODE>thr_suspend()</CODE> and
482
<CODE>thr_resume()</CODE> functions to do that; why don't you?</A></H4>
483
 
484
The POSIX standard provides <B>no</B> mechanism by which a thread A can
485
suspend the execution of another thread B, without cooperation from B.
486
The only way to implement a suspend/restart mechanism is to have B
487
check periodically some global variable for a suspend request
488
and then suspend itself on a condition variable, which another thread
489
can signal later to restart B.<P>
490
 
491
Notice that <CODE>thr_suspend()</CODE> is inherently dangerous and
492
prone to race conditions.  For one thing, there is no control on where
493
the target thread stops: it can very well be stopped in the middle of
494
a critical section, while holding mutexes.  Also, there is no
495
guarantee on when the target thread will actually stop.  For these
496
reasons, you'd be much better off using mutexes and conditions
497
instead.  The only situations that really require the ability to
498
suspend a thread are debuggers and some kind of garbage collectors.<P>
499
 
500
If you really must suspend a thread in LinuxThreads, you can send it a
501
<CODE>SIGSTOP</CODE> signal with <CODE>pthread_kill</CODE>. Send
502
<CODE>SIGCONT</CODE> for restarting it.
503
Beware, this is specific to LinuxThreads and entirely non-portable.
504
Indeed, a truly conforming POSIX threads implementation will stop all
505
threads when one thread receives the <CODE>SIGSTOP</CODE> signal!
506
One day, LinuxThreads will implement that behavior, and the
507
non-portable hack with <CODE>SIGSTOP</CODE> won't work anymore.<P>
508
 
509
<H4><A NAME="E.5">E.5: Does LinuxThreads implement
510
<CODE>pthread_attr_setstacksize()</CODE> and
511
<CODE>pthread_attr_setstackaddr()</CODE>?</A></H4>
512
 
513
These optional functions are provided in recent versions of
514
LinuxThreads (0.8 and up).  Earlier releases did not provide these
515
optional components of the POSIX standard.<P>
516
 
517
Even if <CODE>pthread_attr_setstacksize()</CODE> and
518
<CODE>pthread_attr_setstackaddr()</CODE> are now provided, we still
519
recommend that you do not use them unless you really have strong
520
reasons for doing so.  The default stack allocation strategy for
521
LinuxThreads is nearly optimal: stacks start small (4k) and
522
automatically grow on demand to a fairly large limit (2M).
523
Moreover, there is no portable way to estimate the stack requirements
524
of a thread, so setting the stack size yourself makes your program
525
less reliable and non-portable.<P>
526
 
527
<H4><A NAME="E.6">E.6: LinuxThreads does not support the
528
<CODE>PTHREAD_SCOPE_PROCESS</CODE> value of the "contentionscope"
529
attribute.  Why? </A></H4>
530
 
531
With a "one-to-one" model, as in LinuxThreads (one kernel execution
532
context per thread), there is only one scheduler for all processes and
533
all threads on the system.  So, there is no way to obtain the behavior of
534
<CODE>PTHREAD_SCOPE_PROCESS</CODE>.
535
 
536
<H4><A NAME="E.7">E.7: LinuxThreads does not implement process-shared
537
mutexes, conditions, and semaphores. Why?</A></H4>
538
 
539
This is another optional component of the POSIX standard.  Portable
540
applications should test <CODE>_POSIX_THREAD_PROCESS_SHARED</CODE>
541
before using this facility.
542
<P>
543
The goal of this extension is to allow different processes (with
544
different address spaces) to synchronize through mutexes, conditions
545
or semaphores allocated in shared memory (either SVR4 shared memory
546
segments or <CODE>mmap()</CODE>ed files).
547
<P>
548
The reason why this does not work in LinuxThreads is that mutexes,
549
conditions, and semaphores are not self-contained: their waiting
550
queues contain pointers to linked lists of thread descriptors, and
551
these pointers are meaningful only in one address space.
552
<P>
553
Matt Messier and I spent a significant amount of time trying to design a
554
suitable mechanism for sharing waiting queues between processes.  We
555
came up with several solutions that combined two of the following
556
three desirable features, but none that combines all three:
557
<UL>
558
<LI>allow sharing between processes having different UIDs
559
<LI>supports cancellation
560
<LI>supports <CODE>pthread_cond_timedwait</CODE>
561
</UL>
562
We concluded that kernel support is required to share mutexes,
563
conditions and semaphores between processes.  That's one place where
564
Linus Torvalds's intuition that "all we need in the kernel is
565
<CODE>clone()</CODE>" fails.
566
<P>
567
Until suitable kernel support is available, you'd better use
568
traditional interprocess communications to synchronize different
569
processes: System V semaphores and message queues, or pipes, or sockets.
570
<P>
571
 
572
<HR>
573
<P>
574
 
575
<H2><A NAME="F">F. C++ issues</A></H2>
576
 
577
<H4><A NAME="F.1">F.1: Are there C++ wrappers for LinuxThreads?</A></H4>
578
 
579
Douglas Schmidt's ACE library contains, among a lot of other
580
things, C++ wrappers for LinuxThreads and quite a number of other
581
thread libraries.  Check out
582
<A HREF="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</A><P>
583
 
584
<H4><A NAME="F.2">F.2: I'm trying to use LinuxThreads from a C++
585
program, and the compiler complains about the third argument to
586
<CODE>pthread_create()</CODE> !</A></H4>
587
 
588
You're probably trying to pass a class member function or some
589
other C++ thing as third argument to <CODE>pthread_create()</CODE>.
590
Recall that <CODE>pthread_create()</CODE> is a C function, and it must
591
be passed a C function as third argument.<P>
592
 
593
<H4><A NAME="F.3">F.3: I'm trying to use LinuxThreads in conjunction
594
with libg++, and I'm having all sorts of trouble.</A></H4>
595
 
596
>From what I understand, thread support in libg++ is completely broken,
597
especially with respect to locking of iostreams.  H.J.Lu wrote:
598
<BLOCKQUOTE>
599
If you want to use thread, I can only suggest egcs and glibc. You
600
can find egcs at
601
<A HREF="http://www.cygnus.com/egcs">http://www.cygnus.com/egcs</A>.
602
egcs has libsdtc++, which is MT safe under glibc 2. If you really
603
want to use the libg++, I have a libg++ add-on for egcs.
604
</BLOCKQUOTE>
605
<HR>
606
<P>
607
 
608
<H2><A NAME="G">G. Debugging LinuxThreads programs</A></H2>
609
 
610
<H4><A NAME="G.1">G.1: Can I debug LinuxThreads program using gdb?</A></H4>
611
 
612
Yes, but not with the stock gdb 4.17.  You need a specially patched
613
version of gdb 4.17 developed by Eric Paire and colleages at The Open
614
Group, Grenoble.  The patches against gdb 4.17 are available at
615
<A HREF="http://www.gr.opengroup.org/java/jdk/linux/debug.htm"><code>http://www.gr.opengroup.org/java/jdk/linux/debug.htm</code></A>.
616
Precompiled binaries of the patched gdb are available in RedHat's RPM
617
format at <A
618
HREF="http://odin.appliedtheory.com/"><code>http://odin.appliedtheory.com/</code></A>.<P>
619
 
620
Some Linux distributions provide an already-patched version of gdb;
621
others don't.  For instance, the gdb in RedHat 5.2 is thread-aware,
622
but apparently not the one in RedHat 6.0.  Just ask (politely) the
623
makers of your Linux distributions to please make sure that they apply
624
the correct patches to gdb.<P>
625
 
626
<H4><A NAME="G.2">G.2: Does it work with post-mortem debugging?</A></H4>
627
 
628
Not very well.  Generally, the core file does not correspond to the
629
thread that crashed.  The reason is that the kernel will not dump core
630
for a process that shares its memory with other processes, such as the
631
other threads of your program.  So, the thread that crashes silently
632
disappears without generating a core file.  Then, all other threads of
633
your program die on the same signal that killed the crashing thread.
634
(This is required behavior according to the POSIX standard.)  The last
635
one that dies is no longer sharing its memory with anyone else, so the
636
kernel generates a core file for that thread.  Unfortunately, that's
637
not the thread you are interested in.
638
 
639
<H4><A NAME="G.3">G.3: Any other ways to debug multithreaded programs, then?</A></H4>
640
 
641
Assertions and <CODE>printf()</CODE> are your best friends.  Try to debug
642
sequential parts in a single-threaded program first.  Then, put
643
<CODE>printf()</CODE> statements all over the place to get execution traces.
644
Also, check invariants often with the <CODE>assert()</CODE> macro.  In truth,
645
there is no other effective way (save for a full formal proof of your
646
program) to track down concurrency bugs.  Debuggers are not really
647
effective for subtle concurrency problems, because they disrupt
648
program execution too much.<P>
649
 
650
<HR>
651
<P>
652
 
653
<H2><A NAME="H">H. Compiling multithreaded code; errno madness</A></H2>
654
 
655
<H4><A NAME="H.1">H.1: You say all multithreaded code must be compiled
656
with <CODE>_REENTRANT</CODE> defined. What difference does it make?</A></H4>
657
 
658
It affects include files in three ways:
659
<UL>
660
<LI> The include files define prototypes for the reentrant variants of
661
some of the standard library functions,
662
e.g. <CODE>gethostbyname_r()</CODE> as a reentrant equivalent to
663
<CODE>gethostbyname()</CODE>.<P>
664
 
665
<LI> If <CODE>_REENTRANT</CODE> is defined, some
666
<code>&lt;stdio.h&gt;</code> functions are no longer defined as macros,
667
e.g. <CODE>getc()</CODE> and <CODE>putc()</CODE>. In a multithreaded
668
program, stdio functions require additional locking, which the macros
669
don't perform, so we must call functions instead.<P>
670
 
671
<LI> More importantly, <code>&lt;errno.h&gt;</code> redefines errno when
672
<CODE>_REENTRANT</CODE> is
673
defined, so that errno refers to the thread-specific errno location
674
rather than the global errno variable.  This is achieved by the
675
following <code>#define</code> in <code>&lt;errno.h&gt;</code>:
676
<PRE>
677
        #define errno (*(__errno_location()))
678
</PRE>
679
which causes each reference to errno to call the
680
<CODE>__errno_location()</CODE> function for obtaining the location
681
where error codes are stored.  libc provides a default definition of
682
<CODE>__errno_location()</CODE> that always returns
683
<code>&errno</code> (the address of the global errno variable). Thus,
684
for programs not linked with LinuxThreads, defining
685
<CODE>_REENTRANT</CODE> makes no difference w.r.t. errno processing.
686
But LinuxThreads redefines <CODE>__errno_location()</CODE> to return a
687
location in the thread descriptor reserved for holding the current
688
value of errno for the calling thread.  Thus, each thread operates on
689
a different errno location.
690
</UL>
691
<P>
692
 
693
<H4><A NAME="H.2">H.2: Why is it so important that each thread has its
694
own errno variable? </A></H4>
695
 
696
If all threads were to store error codes in the same, global errno
697
variable, then the value of errno after a system call or library
698
function returns would be unpredictable:  between the time a system
699
call stores its error code in the global errno and your code inspects
700
errno to see which error occurred, another thread might have stored
701
another error code in the same errno location. <P>
702
 
703
<H4><A NAME="H.3">H.3: What happens if I link LinuxThreads with code
704
not compiled with <CODE>-D_REENTRANT</CODE>?</A></H4>
705
 
706
Lots of trouble.  If the code uses <CODE>getc()</CODE> or
707
<CODE>putc()</CODE>, it will perform I/O without proper interlocking
708
of the stdio buffers; this can cause lost output, duplicate output, or
709
just crash other stdio functions.  If the code consults errno, it will
710
get back the wrong error code.  The following code fragment is a
711
typical example:
712
<PRE>
713
        do {
714
          r = read(fd, buf, n);
715
          if (r == -1) {
716
            if (errno == EINTR)   /* an error we can handle */
717
              continue;
718
            else {                /* other errors are fatal */
719
              perror("read failed");
720
              exit(100);
721
            }
722
          }
723
        } while (...);
724
</PRE>
725
Assume this code is not compiled with <CODE>-D_REENTRANT</CODE>, and
726
linked with LinuxThreads.  At run-time, <CODE>read()</CODE> is
727
interrupted.  Since the C library was compiled with
728
<CODE>-D_REENTRANT</CODE>, <CODE>read()</CODE> stores its error code
729
in the location pointed to by <CODE>__errno_location()</CODE>, which
730
is the thread-local errno variable.  Then, the code above sees that
731
<CODE>read()</CODE> returns -1 and looks up errno.  Since
732
<CODE>_REENTRANT</CODE> is not defined, the reference to errno
733
accesses the global errno variable, which is most likely 0.  Hence the
734
code concludes that it cannot handle the error and stops.<P>
735
 
736
<H4><A NAME="H.4">H.4: With LinuxThreads, I can no longer use the signals
737
<code>SIGUSR1</code> and <code>SIGUSR2</code> in my programs! Why? </A></H4>
738
 
739
The short answer is: because the Linux kernel you're using does not
740
support realtime signals.  <P>
741
 
742
LinuxThreads needs two signals for its internal operation.
743
One is used to suspend and restart threads blocked on mutex, condition
744
or semaphore operations.  The other is used for thread
745
cancellation.<P>
746
 
747
On ``old'' kernels (2.0 and early 2.1 kernels), there are only 32
748
signals available and the kernel reserves all of them but two:
749
<code>SIGUSR1</code> and <code>SIGUSR2</code>.  So, LinuxThreads has
750
no choice but use those two signals.<P>
751
 
752
On recent kernels (2.2 and up), more than 32 signals are provided in
753
the form of realtime signals. When run on one of those kernels,
754
LinuxThreads uses two reserved realtime signals for its internal
755
operation, thus leaving <code>SIGUSR1</code> and <code>SIGUSR2</code>
756
free for user code.  (This works only with glibc, not with libc 5.) <P>
757
 
758
<H4><A NAME="H.5">H.5: Is the stack of one thread visible from the
759
other threads?  Can I pass a pointer into my stack to other threads?
760
</A></H4>
761
 
762
Yes, you can -- if you're very careful.  The stacks are indeed visible
763
from all threads in the system.  Some non-POSIX thread libraries seem
764
to map the stacks for all threads at the same virtual addresses and
765
change the memory mapping when they switch from one thread to
766
another.  But this is not the case for LinuxThreads, as it would make
767
context switching between threads more expensive, and at any rate
768
might not conform to the POSIX standard.<P>
769
 
770
So, you can take the address of an "auto" variable and pass it to
771
other threads via shared data structures.  However, you need to make
772
absolutely sure that the function doing this will not return as long
773
as other threads need to access this address.  It's the usual mistake
774
of returning the address of an "auto" variable, only made much worse
775
because of concurrency.  It's much, much safer to systematically
776
heap-allocate all shared data structures. <P>
777
 
778
<HR>
779
<P>
780
 
781
<H2><A NAME="I">I.  X-Windows and other libraries</A></H2>
782
 
783
<H4><A NAME="I.1">I.1: My program uses both Xlib and LinuxThreads.
784
It stops very early with an "Xlib: unknown 0 error" message.  What
785
does this mean? </A></H4>
786
 
787
That's a prime example of the errno problem described in question <A
788
HREF="#H.2">H.2</A>.  The binaries for Xlib you're using have not been
789
compiled with <CODE>-D_REENTRANT</CODE>.  It happens Xlib contains a
790
piece of code very much like the one in question <A
791
HREF="#H.2">H.2</A>.  So, your Xlib fetches the error code from the
792
wrong errno location and concludes that an error it cannot handle
793
occurred.<P>
794
 
795
<H4><A NAME="I.2">I.2: So, what can I do to build a multithreaded X
796
Windows client? </A></H4>
797
 
798
The best solution is to use X libraries that have been compiled with
799
multithreading options set.  Linux distributions that come with glibc
800
2 as the main C library generally provide thread-safe X libraries.
801
At least, that seems to be the case for RedHat 5 and later.<P>
802
 
803
You can try to recompile yourself the X libraries with multithreading
804
options set.  They contain optional support for multithreading; it's
805
just that the binaries provided by your Linux distribution were built
806
without this support.  See the file <code>README.Xfree3.3</code> in
807
the LinuxThreads distribution for patches and info on how to compile
808
thread-safe X libraries from the Xfree3.3 distribution.  The Xfree3.3
809
sources are readily available in most Linux distributions, e.g. as a
810
source RPM for RedHat.  Be warned, however, that X Windows is a huge
811
system, and recompiling even just the libraries takes a lot of time
812
and disk space.<P>
813
 
814
Another, less involving solution is to call X functions only from the
815
main thread of your program.  Even if all threads have their own errno
816
location, the main thread uses the global errno variable for its errno
817
location.  Thus, code not compiled with <code>-D_REENTRANT</code>
818
still "sees" the right error values if it executes in the main thread
819
only. <P>
820
 
821
<H4><A NAME="I.2">This is a lot of work. Don't you have precompiled
822
thread-safe X libraries that you could distribute?</A></H4>
823
 
824
No, I don't.  Sorry.  But consider installing a Linux distribution
825
that comes with thread-safe X libraries, such as RedHat 6.<P>
826
 
827
<H4><A NAME="I.3">I.3: Can I use library FOO in a multithreaded
828
program?</A></H4>
829
 
830
Most libraries cannot be used "as is" in a multithreaded program.
831
For one thing, they are not necessarily thread-safe: calling
832
simultaneously two functions of the library from two threads might not
833
work, due to internal use of global variables and the like.  Second,
834
the libraries must have been compiled with <CODE>-D_REENTRANT</CODE> to avoid
835
the errno problems explained in question <A HREF="#H.2">H.2</A>.
836
<P>
837
 
838
<H4><A NAME="I.4">I.4: What if I make sure that only one thread calls
839
functions in these libraries?</A></H4>
840
 
841
This avoids problems with the library not being thread-safe.  But
842
you're still vulnerable to errno problems.  At the very least, a
843
recompile of the library with <CODE>-D_REENTRANT</CODE> is needed.
844
<P>
845
 
846
<H4><A NAME="I.5">I.5: What if I make sure that only the main thread
847
calls functions in these libraries?</A></H4>
848
 
849
That might actually work.  As explained in question <A HREF="#I.1">I.1</A>,
850
the main thread uses the global errno variable, and can therefore
851
execute code not compiled with <CODE>-D_REENTRANT</CODE>.<P>
852
 
853
<H4><A NAME="I.6">I.6: SVGAlib doesn't work with LinuxThreads.  Why?
854
</A></H4>
855
 
856
Because both LinuxThreads and SVGAlib use the signals
857
<code>SIGUSR1</code> and <code>SIGUSR2</code>.  See question <A
858
HREF="#H.4">H.4</A>.
859
<P>
860
 
861
 
862
<HR>
863
<P>
864
 
865
<H2><A NAME="J">J.  Signals and threads</A></H2>
866
 
867
<H4><A NAME="J.1">J.1: When it comes to signals, what is shared
868
between threads and what isn't?</A></H4>
869
 
870
Signal handlers are shared between all threads: when a thread calls
871
<CODE>sigaction()</CODE>, it sets how the signal is handled not only
872
for itself, but for all other threads in the program as well.<P>
873
 
874
On the other hand, signal masks are per-thread: each thread chooses
875
which signals it blocks independently of others.  At thread creation
876
time, the newly created thread inherits the signal mask of the thread
877
calling <CODE>pthread_create()</CODE>.  But afterwards, the new thread
878
can modify its signal mask independently of its creator thread.<P>
879
 
880
<H4><A NAME="J.2">J.2: When I send a <CODE>SIGKILL</CODE> to a
881
particular thread using <CODE>pthread_kill</CODE>, all my threads are
882
killed!</A></H4>
883
 
884
That's how it should be.  The POSIX standard mandates that all threads
885
should terminate when the process (i.e. the collection of all threads
886
running the program) receives a signal whose effect is to
887
terminate the process (such as <CODE>SIGKILL</CODE> or <CODE>SIGINT</CODE>
888
when no handler is installed on that signal).  This behavior makes a
889
lot of sense: when you type "ctrl-C" at the keyboard, or when a thread
890
crashes on a division by zero or a segmentation fault, you really want
891
all threads to stop immediately, not just the one that caused the
892
segmentation violation or that got the <CODE>SIGINT</CODE> signal.
893
(This assumes default behavior for those signals; see question
894
<A HREF="#J.3">J.3</A> if you install handlers for those signals.)<P>
895
 
896
If you're trying to terminate a thread without bringing the whole
897
process down, use <code>pthread_cancel()</code>.<P>
898
 
899
<H4><A NAME="J.3">J.3: I've installed a handler on a signal.  Which
900
thread executes the handler when the signal is received?</A></H4>
901
 
902
If the signal is generated by a thread during its execution (e.g. a
903
thread executes a division by zero and thus generates a
904
<CODE>SIGFPE</CODE> signal), then the handler is executed by that
905
thread.  This also applies to signals generated by
906
<CODE>raise()</CODE>.<P>
907
 
908
If the signal is sent to a particular thread using
909
<CODE>pthread_kill()</CODE>, then that thread executes the handler.<P>
910
 
911
If the signal is sent via <CODE>kill()</CODE> or the tty interface
912
(e.g. by pressing ctrl-C), then the POSIX specs say that the handler
913
is executed by any thread in the process that does not currently block
914
the signal.  In other terms, POSIX considers that the signal is sent
915
to the process (the collection of all threads) as a whole, and any
916
thread that is not blocking this signal can then handle it.<P>
917
 
918
The latter case is where LinuxThreads departs from the POSIX specs.
919
In LinuxThreads, there is no real notion of ``the process as a whole'':
920
in the kernel, each thread is really a distinct process with a
921
distinct PID, and signals sent to the PID of a thread can only be
922
handled by that thread.  As long as no thread is blocking the signal,
923
the behavior conforms to the standard: one (unspecified) thread of the
924
program handles the signal.  But if the thread to which PID the signal
925
is sent blocks the signal, and some other thread does not block the
926
signal, then LinuxThreads will simply queue in
927
that thread and execute the handler only when that thread unblocks
928
the signal, instead of executing the handler immediately in the other
929
thread that does not block the signal.<P>
930
 
931
This is to be viewed as a LinuxThreads bug, but I currently don't see
932
any way to implement the POSIX behavior without kernel support.<P>
933
 
934
<H4><A NAME="J.3">J.3: How shall I go about mixing signals and threads
935
in my program? </A></H4>
936
 
937
The less you mix them, the better.  Notice that all
938
<CODE>pthread_*</CODE> functions are not async-signal safe, meaning
939
that you should not call them from signal handlers.  This
940
recommendation is not to be taken lightly: your program can deadlock
941
if you call a <CODE>pthread_*</CODE> function from a signal handler!
942
<P>
943
 
944
The only sensible things you can do from a signal handler is set a
945
global flag, or call <CODE>sem_post</CODE> on a semaphore, to record
946
the delivery of the signal.  The remainder of the program can then
947
either poll the global flag, or use <CODE>sem_wait()</CODE> and
948
<CODE>sem_trywait()</CODE> on the semaphore.<P>
949
 
950
Another option is to do nothing in the signal handler, and dedicate
951
one thread (preferably the initial thread) to wait synchronously for
952
signals, using <CODE>sigwait()</CODE>, and send messages to the other
953
threads accordingly.
954
 
955
<H4><A NAME="J.4">J.4: When one thread is blocked in
956
<CODE>sigwait()</CODE>, other threads no longer receive the signals
957
<CODE>sigwait()</CODE> is waiting for!  What happens? </A></H4>
958
 
959
It's an unfortunate consequence of how LinuxThreads implements
960
<CODE>sigwait()</CODE>.  Basically, it installs signal handlers on all
961
signals waited for, in order to record which signal was received.
962
Since signal handlers are shared with the other threads, this
963
temporarily deactivates any signal handlers you might have previously
964
installed on these signals.<P>
965
 
966
Though surprising, this behavior actually seems to conform to the
967
POSIX standard.  According to POSIX, <CODE>sigwait()</CODE> is
968
guaranteed to work as expected only if all other threads in the
969
program block the signals waited for (otherwise, the signals could be
970
delivered to other threads than the one doing <CODE>sigwait()</CODE>,
971
which would make <CODE>sigwait()</CODE> useless).  In this particular
972
case, the problem described in this question does not appear.<P>
973
 
974
One day, <CODE>sigwait()</CODE> will be implemented in the kernel,
975
along with others POSIX 1003.1b extensions, and <CODE>sigwait()</CODE>
976
will have a more natural behavior (as well as better performances).<P>
977
 
978
<HR>
979
<P>
980
 
981
<H2><A NAME="K">K.  Internals of LinuxThreads</A></H2>
982
 
983
<H4><A NAME="K.1">K.1: What is the implementation model for
984
LinuxThreads?</A></H4>
985
 
986
LinuxThreads follows the so-called "one-to-one" model: each thread is
987
actually a separate process in the kernel.  The kernel scheduler takes
988
care of scheduling the threads, just like it schedules regular
989
processes.  The threads are created with the Linux
990
<code>clone()</code> system call, which is a generalization of
991
<code>fork()</code> allowing the new process to share the memory
992
space, file descriptors, and signal handlers of the parent.<P>
993
 
994
Advantages of the "one-to-one" model include:
995
<UL>
996
<LI> minimal overhead on CPU-intensive multiprocessing (with
997
about one thread per processor);
998
<LI> minimal overhead on I/O operations;
999
<LI> a simple and robust implementation (the kernel scheduler does
1000
most of the hard work for us).
1001
</UL>
1002
The main disadvantage is more expensive context switches on mutex and
1003
condition operations, which must go through the kernel.  This is
1004
mitigated by the fact that context switches in the Linux kernel are
1005
pretty efficient.<P>
1006
 
1007
<H4><A NAME="K.2">K.2: Have you considered other implementation
1008
models?</A></H4>
1009
 
1010
There are basically two other models.  The "many-to-one" model
1011
relies on a user-level scheduler that context-switches between the
1012
threads entirely in user code; viewed from the kernel, there is only
1013
one process running.  This model is completely out of the question for
1014
me, since it does not take advantage of multiprocessors, and require
1015
unholy magic to handle blocking I/O operations properly.  There are
1016
several user-level thread libraries available for Linux, but I found
1017
all of them deficient in functionality, performance, and/or robustness.
1018
<P>
1019
 
1020
The "many-to-many" model combines both kernel-level and user-level
1021
scheduling: several kernel-level threads run concurrently, each
1022
executing a user-level scheduler that selects between user threads.
1023
Most commercial Unix systems (Solaris, Digital Unix, IRIX) implement
1024
POSIX threads this way.  This model combines the advantages of both
1025
the "many-to-one" and the "one-to-one" model, and is attractive
1026
because it avoids the worst-case behaviors of both models --
1027
especially on kernels where context switches are expensive, such as
1028
Digital Unix.  Unfortunately, it is pretty complex to implement, and
1029
requires kernel support which Linux does not provide.  Linus Torvalds
1030
and other Linux kernel developers have always been pushing the
1031
"one-to-one" model in the name of overall simplicity, and are doing a
1032
pretty good job of making kernel-level context switches between
1033
threads efficient.  LinuxThreads is just following the general
1034
direction they set.<P>
1035
 
1036
<HR>
1037
<ADDRESS>Xavier.Leroy@inria.fr</ADDRESS>
1038
</BODY>
1039
</HTML>

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.