1.0.41.42: ppc: Documentation and NEWS updates for threading.
[sbcl.git] / doc / manual / threading.texinfo
1 @node  Threading
2 @comment  node-name,  next,  previous,  up
3 @chapter Threading
4
5 SBCL supports a fairly low-level threading interface that maps onto
6 the host operating system's concept of threads or lightweight
7 processes.  This means that threads may take advantage of hardware
8 multiprocessing on machines that have more than one CPU, but it does
9 not allow Lisp control of the scheduler.  This is found in the
10 SB-THREAD package.
11
12 Threads are part of the default build on x86[-64] Linux only.
13
14 They are also experimentally supported on: x86[-64] Darwin (Mac OS X),
15 x86[-64] FreeBSD, x86 SunOS (Solaris), and PPC Linux. On these platforms
16 threads must be explicitly enabled at build-time, see @file{INSTALL} for
17 directions.
18
19 @menu
20 * Threading basics::            
21 * Special Variables::           
22 * Atomic Operations::           
23 * Mutex Support::               
24 * Semaphores::                  
25 * Waitqueue/condition variables::  
26 * Barriers::                    
27 * Sessions/Debugging::          
28 * Foreign threads::             
29 * Implementation (Linux x86/x86-64)::  
30 @end menu
31
32 @node Threading basics
33 @comment  node-name,  next,  previous,  up
34 @section Threading basics
35
36 @lisp
37 (make-thread (lambda () (write-line "Hello, world")))
38 @end lisp
39
40 @subsection Thread Objects
41
42 @include struct-sb-thread-thread.texinfo
43 @include var-sb-thread-star-current-thread-star.texinfo
44 @include fun-sb-thread-list-all-threads.texinfo
45 @include fun-sb-thread-thread-alive-p.texinfo
46 @include fun-sb-thread-thread-name.texinfo
47
48 @subsection Making, Joining, and Yielding Threads
49
50 @include fun-sb-thread-make-thread.texinfo
51 @include fun-sb-thread-thread-yield.texinfo
52 @include fun-sb-thread-join-thread.texinfo
53
54 @subsection Asynchronous Operations
55
56 @include fun-sb-thread-interrupt-thread.texinfo
57 @include fun-sb-thread-terminate-thread.texinfo
58
59 @subsection Miscellaneous Operations
60
61 @include fun-sb-thread-symbol-value-in-thread.texinfo
62
63 @subsection Error Conditions
64
65 @include condition-sb-thread-thread-error.texinfo
66 @include fun-sb-thread-thread-error-thread.texinfo
67
68 @c @include condition-sb-thread-symbol-value-in-thread-error.texinfo
69 @include condition-sb-thread-interrupt-thread-error.texinfo
70 @include condition-sb-thread-join-thread-error.texinfo
71
72 @node Special Variables
73 @comment  node-name,  next,  previous,  up
74 @section Special Variables
75
76 The interaction of special variables with multiple threads is mostly
77 as one would expect, with behaviour very similar to other
78 implementations.
79
80 @itemize
81 @item
82 global special values are visible across all threads;
83 @item
84 bindings (e.g. using LET) are local to the thread;
85 @item
86 threads do not inherit dynamic bindings from the parent thread
87 @end itemize
88
89 The last point means that
90
91 @lisp
92 (defparameter *x* 0)
93 (let ((*x* 1))
94   (sb-thread:make-thread (lambda () (print *x*))))
95 @end lisp
96
97 prints @code{0} and not @code{1} as of 0.9.6.
98
99 @node Atomic Operations
100 @comment  node-name,  next,  previous,  up
101 @section Atomic Operations
102
103 SBCL provides a few special purpose atomic operations, particularly
104 useful for implementing lockless algorithms.
105
106 @include macro-sb-ext-atomic-decf.texinfo
107 @include macro-sb-ext-atomic-incf.texinfo
108 @include macro-sb-ext-compare-and-swap.texinfo
109
110 @node Mutex Support
111 @comment  node-name,  next,  previous,  up
112 @section Mutex Support
113
114 Mutexes are used for controlling access to a shared resource. One
115 thread is allowed to hold the mutex, others which attempt to take it
116 will be made to wait until it's free. Threads are woken in the order
117 that they go to sleep.
118
119 There isn't a timeout on mutex acquisition, but the usual WITH-TIMEOUT
120 macro (which throws a TIMEOUT condition after n seconds) can be used
121 if you want a bounded wait.
122
123 @lisp
124 (defpackage :demo (:use "CL" "SB-THREAD" "SB-EXT"))
125
126 (in-package :demo)
127
128 (defvar *a-mutex* (make-mutex :name "my lock"))
129
130 (defun thread-fn ()
131   (format t "Thread ~A running ~%" *current-thread*)
132   (with-mutex (*a-mutex*)
133     (format t "Thread ~A got the lock~%" *current-thread*)
134     (sleep (random 5)))
135   (format t "Thread ~A dropped lock, dying now~%" *current-thread*))
136
137 (make-thread #'thread-fn)
138 (make-thread #'thread-fn)
139 @end lisp
140
141 @include struct-sb-thread-mutex.texinfo
142 @include fun-sb-thread-make-mutex.texinfo
143 @include fun-sb-thread-mutex-name.texinfo
144 @include fun-sb-thread-mutex-value.texinfo
145 @include fun-sb-thread-get-mutex.texinfo
146 @include fun-sb-thread-release-mutex.texinfo
147 @include macro-sb-thread-with-mutex.texinfo
148 @include macro-sb-thread-with-recursive-lock.texinfo
149
150 @node Semaphores
151 @comment  node-name,  next,  previous,  up
152 @section Semaphores
153
154 described here should be considered
155 experimental, subject to API changes without notice.
156
157 @include struct-sb-thread-semaphore.texinfo
158 @include fun-sb-thread-make-semaphore.texinfo
159 @include fun-sb-thread-semaphore-count.texinfo
160 @include fun-sb-thread-semaphore-name.texinfo
161 @include fun-sb-thread-signal-semaphore.texinfo
162 @include fun-sb-thread-try-semaphore.texinfo
163 @include fun-sb-thread-wait-on-semaphore.texinfo
164
165 @node Waitqueue/condition variables
166 @comment  node-name,  next,  previous,  up
167 @section Waitqueue/condition variables
168
169 These are based on the POSIX condition variable design, hence the
170 annoyingly CL-conflicting name. For use when you want to check a
171 condition and sleep until it's true. For example: you have a shared
172 queue, a writer process checking ``queue is empty'' and one or more
173 readers that need to know when ``queue is not empty''. It sounds
174 simple, but is astonishingly easy to deadlock if another process runs
175 when you weren't expecting it to.
176
177 There are three components:
178
179 @itemize
180 @item
181 the condition itself (not represented in code)
182
183 @item
184 the condition variable (a.k.a waitqueue) which proxies for it
185
186 @item
187 a lock to hold while testing the condition
188 @end itemize
189
190 Important stuff to be aware of:
191
192 @itemize
193 @item
194 when calling condition-wait, you must hold the mutex. condition-wait
195 will drop the mutex while it waits, and obtain it again before
196 returning for whatever reason;
197
198 @item
199 likewise, you must be holding the mutex around calls to
200 condition-notify;
201
202 @item
203 a process may return from condition-wait in several circumstances: it
204 is not guaranteed that the underlying condition has become true. You
205 must check that the resource is ready for whatever you want to do to
206 it.
207
208 @end itemize
209
210 @lisp
211 (defvar *buffer-queue* (make-waitqueue))
212 (defvar *buffer-lock* (make-mutex :name "buffer lock"))
213
214 (defvar *buffer* (list nil))
215
216 (defun reader ()
217   (with-mutex (*buffer-lock*)
218     (loop
219      (condition-wait *buffer-queue* *buffer-lock*)
220      (loop
221       (unless *buffer* (return))
222       (let ((head (car *buffer*)))
223         (setf *buffer* (cdr *buffer*))
224         (format t "reader ~A woke, read ~A~%"
225                 *current-thread* head))))))
226
227 (defun writer ()
228   (loop
229    (sleep (random 5))
230    (with-mutex (*buffer-lock*)
231      (let ((el (intern
232                 (string (code-char
233                          (+ (char-code #\A) (random 26)))))))
234        (setf *buffer* (cons el *buffer*)))
235      (condition-notify *buffer-queue*))))
236
237 (make-thread #'writer)
238 (make-thread #'reader)
239 (make-thread #'reader)
240 @end lisp
241
242 @include struct-sb-thread-waitqueue.texinfo
243 @include fun-sb-thread-make-waitqueue.texinfo
244 @include fun-sb-thread-waitqueue-name.texinfo
245 @include fun-sb-thread-condition-wait.texinfo
246 @include fun-sb-thread-condition-notify.texinfo
247 @include fun-sb-thread-condition-broadcast.texinfo
248
249 @node Barriers
250 @comment  node-name,  next,  previous,  up
251 @section Barriers
252
253 These are based on the Linux kernel barrier design, which is in turn
254 based on the Alpha CPU memory model.  They are presently implemented for
255 x86, x86-64, and PPC systems, and behave as compiler barriers on all
256 other CPUs.
257
258 In addition to explicit use of the @code{sb-thread:barrier} macro, the
259 following functions and macros also serve as @code{:memory} barriers:
260
261 @itemize
262 @item
263 @code{sb-ext:atomic-decf} and @code{sb-ext:atomic-incf}.
264 @item
265 @code{sb-ext:compare-and-swap}.
266 @item
267 @code{sb-thread:get-mutex}, @code{sb-thread:release-mutex},
268 @code{sb-thread:with-mutex} and @code{sb-thread:with-recursive-lock}.
269 @item
270 @code{sb-thread:signal-semaphore}, @code{sb-thread:try-semaphore} and
271 @code{sb-thread:wait-on-semaphore}.
272 @item
273 @code{sb-thread:condition-wait}, @code{sb-thread:condition-notify} and
274 @code{sb-thread:condition-broadcast}.
275 @end itemize
276
277 @include macro-sb-thread-barrier.texinfo
278
279 @node Sessions/Debugging
280 @comment  node-name,  next,  previous,  up
281 @section Sessions/Debugging
282
283 If the user has multiple views onto the same Lisp image (for example,
284 using multiple terminals, or a windowing system, or network access)
285 they are typically set up as multiple @dfn{sessions} such that each
286 view has its own collection of foreground/background/stopped threads.
287 A thread which wishes to create a new session can use
288 @code{sb-thread:with-new-session} to remove itself from the current
289 session (which it shares with its parent and siblings) and create a
290 fresh one.
291 # See also @code{sb-thread:make-listener-thread}.
292
293 Within a single session, threads arbitrate between themselves for the
294 user's attention.  A thread may be in one of three notional states:
295 foreground, background, or stopped.  When a background process
296 attempts to print a repl prompt or to enter the debugger, it will stop
297 and print a message saying that it has stopped.  The user at his
298 leisure may switch to that thread to find out what it needs.  If a
299 background thread enters the debugger, selecting any restart will put
300 it back into the background before it resumes.  Arbitration for the
301 input stream is managed by calls to @code{sb-thread:get-foreground}
302 (which may block) and @code{sb-thread:release-foreground}.
303
304 @code{sb-ext:quit} terminates all threads in the current session, but
305 leaves other sessions running.
306
307 @node Foreign threads
308 @comment  node-name,  next,  previous,  up
309 @section Foreign threads
310
311 Direct calls to @code{pthread_create} (instead of @code{MAKE-THREAD})
312 create threads that SBCL is not aware of, these are called foreign
313 threads. Currently, it is not possible to run Lisp code in such
314 threads. This means that the Lisp side signal handlers cannot work.
315 The best solution is to start foreign threads with signals blocked,
316 but since third party libraries may create threads, it is not always
317 feasible to do so. As a workaround, upon receiving a signal in a
318 foreign thread, SBCL changes the thread's sigmask to block all signals
319 that it wants to handle and resends the signal to the current process
320 which should land in a thread that does not block it, that is, a Lisp
321 thread.
322
323 The resignalling trick cannot work for synchronously triggered signals
324 (SIGSEGV and co), take care not to trigger any. Resignalling for
325 synchronously triggered signals in foreign threads is subject to
326 @code{--lose-on-corruption}, see @ref{Runtime Options}.
327
328 @node Implementation (Linux x86/x86-64)
329 @comment  node-name,  next,  previous,  up
330 @section Implementation (Linux x86/x86-64)
331
332 Threading is implemented using pthreads and some Linux specific bits
333 like futexes.
334
335 On x86 the per-thread local bindings for special variables is achieved
336 using the %fs segment register to point to a per-thread storage area.
337 This may cause interesting results if you link to foreign code that
338 expects threading or creates new threads, and the thread library in
339 question uses %fs in an incompatible way. On x86-64 the r12 register
340 has a similar role.
341
342 Queues require the @code{sys_futex()} system call to be available:
343 this is the reason for the NPTL requirement.  We test at runtime that
344 this system call exists.
345
346 Garbage collection is done with the existing Conservative Generational
347 GC.  Allocation is done in small (typically 8k) regions: each thread
348 has its own region so this involves no stopping. However, when a
349 region fills, a lock must be obtained while another is allocated, and
350 when a collection is required, all processes are stopped.  This is
351 achieved by sending them signals, which may make for interesting
352 behaviour if they are interrupted in system calls.  The streams
353 interface is believed to handle the required system call restarting
354 correctly, but this may be a consideration when making other blocking
355 calls e.g. from foreign library code.
356
357 Large amounts of the SBCL library have not been inspected for
358 thread-safety.  Some of the obviously unsafe areas have large locks
359 around them, so compilation and fasl loading, for example, cannot be
360 parallelized.  Work is ongoing in this area.
361
362 A new thread by default is created in the same POSIX process group and
363 session as the thread it was created by.  This has an impact on
364 keyboard interrupt handling: pressing your terminal's intr key
365 (typically @kbd{Control-C}) will interrupt all processes in the
366 foreground process group, including Lisp threads that SBCL considers
367 to be notionally `background'.  This is undesirable, so background
368 threads are set to ignore the SIGINT signal.
369
370 @code{sb-thread:make-listener-thread} in addition to creating a new
371 Lisp session makes a new POSIX session, so that pressing
372 @kbd{Control-C} in one window will not interrupt another listener -
373 this has been found to be embarrassing.