OSDN Git Service

Seperate pthread debugging from uClibc debugging. They are used
[uclinux-h8/uClibc.git] / libpthread / linuxthreads / FAQ.html
1 <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>