2 @comment node-name, next, previous, up
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
12 Threads are part of the default build on x86[-64] Linux only.
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
25 * Waitqueue/condition variables::
27 * Sessions/Debugging::
29 * Implementation (Linux x86/x86-64)::
32 @node Threading basics
33 @comment node-name, next, previous, up
34 @section Threading basics
37 (make-thread (lambda () (write-line "Hello, world")))
40 @subsection Thread Objects
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
48 @subsection Making, Joining, and Yielding Threads
50 @include fun-sb-thread-make-thread.texinfo
51 @include fun-sb-thread-thread-yield.texinfo
52 @include fun-sb-thread-join-thread.texinfo
54 @subsection Asynchronous Operations
56 @include fun-sb-thread-interrupt-thread.texinfo
57 @include fun-sb-thread-terminate-thread.texinfo
59 @subsection Miscellaneous Operations
61 @include fun-sb-thread-symbol-value-in-thread.texinfo
63 @subsection Error Conditions
65 @include condition-sb-thread-thread-error.texinfo
66 @include fun-sb-thread-thread-error-thread.texinfo
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
72 @node Special Variables
73 @comment node-name, next, previous, up
74 @section Special Variables
76 The interaction of special variables with multiple threads is mostly
77 as one would expect, with behaviour very similar to other
82 global special values are visible across all threads;
84 bindings (e.g. using LET) are local to the thread;
86 threads do not inherit dynamic bindings from the parent thread
89 The last point means that
94 (sb-thread:make-thread (lambda () (print *x*))))
97 prints @code{0} and not @code{1} as of 0.9.6.
99 @node Atomic Operations
100 @comment node-name, next, previous, up
101 @section Atomic Operations
103 SBCL provides a few special purpose atomic operations, particularly
104 useful for implementing lockless algorithms.
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
110 @unnumberedsubsec CAS Protocol
112 Our @code{compare-and-swap} is user-extensible using a protocol similar
115 @include macro-sb-ext-cas.texinfo
116 @include macro-sb-ext-define-cas-expander.texinfo
117 @include macro-sb-ext-defcas.texinfo
118 @include fun-sb-ext-get-cas-expansion.texinfo
121 @comment node-name, next, previous, up
122 @section Mutex Support
124 Mutexes are used for controlling access to a shared resource. One
125 thread is allowed to hold the mutex, others which attempt to take it
126 will be made to wait until it's free. Threads are woken in the order
127 that they go to sleep.
129 There isn't a timeout on mutex acquisition, but the usual WITH-TIMEOUT
130 macro (which throws a TIMEOUT condition after n seconds) can be used
131 if you want a bounded wait.
134 (defpackage :demo (:use "CL" "SB-THREAD" "SB-EXT"))
138 (defvar *a-mutex* (make-mutex :name "my lock"))
141 (format t "Thread ~A running ~%" *current-thread*)
142 (with-mutex (*a-mutex*)
143 (format t "Thread ~A got the lock~%" *current-thread*)
145 (format t "Thread ~A dropped lock, dying now~%" *current-thread*))
147 (make-thread #'thread-fn)
148 (make-thread #'thread-fn)
151 @include struct-sb-thread-mutex.texinfo
152 @include fun-sb-thread-make-mutex.texinfo
153 @include fun-sb-thread-mutex-name.texinfo
154 @include fun-sb-thread-mutex-value.texinfo
155 @include fun-sb-thread-grab-mutex.texinfo
156 @include fun-sb-thread-release-mutex.texinfo
157 @include macro-sb-thread-with-mutex.texinfo
158 @include macro-sb-thread-with-recursive-lock.texinfo
159 @include fun-sb-thread-get-mutex.texinfo
162 @comment node-name, next, previous, up
165 described here should be considered
166 experimental, subject to API changes without notice.
168 @include struct-sb-thread-semaphore.texinfo
169 @include fun-sb-thread-make-semaphore.texinfo
170 @include fun-sb-thread-semaphore-count.texinfo
171 @include fun-sb-thread-semaphore-name.texinfo
172 @include fun-sb-thread-signal-semaphore.texinfo
173 @include fun-sb-thread-try-semaphore.texinfo
174 @include fun-sb-thread-wait-on-semaphore.texinfo
176 @node Waitqueue/condition variables
177 @comment node-name, next, previous, up
178 @section Waitqueue/condition variables
180 These are based on the POSIX condition variable design, hence the
181 annoyingly CL-conflicting name. For use when you want to check a
182 condition and sleep until it's true. For example: you have a shared
183 queue, a writer process checking ``queue is empty'' and one or more
184 readers that need to know when ``queue is not empty''. It sounds
185 simple, but is astonishingly easy to deadlock if another process runs
186 when you weren't expecting it to.
188 There are three components:
192 the condition itself (not represented in code)
195 the condition variable (a.k.a waitqueue) which proxies for it
198 a lock to hold while testing the condition
201 Important stuff to be aware of:
205 when calling condition-wait, you must hold the mutex. condition-wait
206 will drop the mutex while it waits, and obtain it again before
207 returning for whatever reason;
210 likewise, you must be holding the mutex around calls to
214 a process may return from condition-wait in several circumstances: it
215 is not guaranteed that the underlying condition has become true. You
216 must check that the resource is ready for whatever you want to do to
222 (defvar *buffer-queue* (make-waitqueue))
223 (defvar *buffer-lock* (make-mutex :name "buffer lock"))
225 (defvar *buffer* (list nil))
228 (with-mutex (*buffer-lock*)
230 (condition-wait *buffer-queue* *buffer-lock*)
232 (unless *buffer* (return))
233 (let ((head (car *buffer*)))
234 (setf *buffer* (cdr *buffer*))
235 (format t "reader ~A woke, read ~A~%"
236 *current-thread* head))))))
241 (with-mutex (*buffer-lock*)
244 (+ (char-code #\A) (random 26)))))))
245 (setf *buffer* (cons el *buffer*)))
246 (condition-notify *buffer-queue*))))
248 (make-thread #'writer)
249 (make-thread #'reader)
250 (make-thread #'reader)
253 @include struct-sb-thread-waitqueue.texinfo
254 @include fun-sb-thread-make-waitqueue.texinfo
255 @include fun-sb-thread-waitqueue-name.texinfo
256 @include fun-sb-thread-condition-wait.texinfo
257 @include fun-sb-thread-condition-notify.texinfo
258 @include fun-sb-thread-condition-broadcast.texinfo
261 @comment node-name, next, previous, up
264 These are based on the Linux kernel barrier design, which is in turn
265 based on the Alpha CPU memory model. They are presently implemented for
266 x86, x86-64, and PPC systems, and behave as compiler barriers on all
269 In addition to explicit use of the @code{sb-thread:barrier} macro, the
270 following functions and macros also serve as @code{:memory} barriers:
274 @code{sb-ext:atomic-decf} and @code{sb-ext:atomic-incf}.
276 @code{sb-ext:compare-and-swap}.
278 @code{sb-thread:get-mutex}, @code{sb-thread:release-mutex},
279 @code{sb-thread:with-mutex} and @code{sb-thread:with-recursive-lock}.
281 @code{sb-thread:signal-semaphore}, @code{sb-thread:try-semaphore} and
282 @code{sb-thread:wait-on-semaphore}.
284 @code{sb-thread:condition-wait}, @code{sb-thread:condition-notify} and
285 @code{sb-thread:condition-broadcast}.
288 @include macro-sb-thread-barrier.texinfo
290 @node Sessions/Debugging
291 @comment node-name, next, previous, up
292 @section Sessions/Debugging
294 If the user has multiple views onto the same Lisp image (for example,
295 using multiple terminals, or a windowing system, or network access)
296 they are typically set up as multiple @dfn{sessions} such that each
297 view has its own collection of foreground/background/stopped threads.
298 A thread which wishes to create a new session can use
299 @code{sb-thread:with-new-session} to remove itself from the current
300 session (which it shares with its parent and siblings) and create a
302 # See also @code{sb-thread:make-listener-thread}.
304 Within a single session, threads arbitrate between themselves for the
305 user's attention. A thread may be in one of three notional states:
306 foreground, background, or stopped. When a background process
307 attempts to print a repl prompt or to enter the debugger, it will stop
308 and print a message saying that it has stopped. The user at his
309 leisure may switch to that thread to find out what it needs. If a
310 background thread enters the debugger, selecting any restart will put
311 it back into the background before it resumes. Arbitration for the
312 input stream is managed by calls to @code{sb-thread:get-foreground}
313 (which may block) and @code{sb-thread:release-foreground}.
315 @code{sb-ext:quit} terminates all threads in the current session, but
316 leaves other sessions running.
318 @node Foreign threads
319 @comment node-name, next, previous, up
320 @section Foreign threads
322 Direct calls to @code{pthread_create} (instead of @code{MAKE-THREAD})
323 create threads that SBCL is not aware of, these are called foreign
324 threads. Currently, it is not possible to run Lisp code in such
325 threads. This means that the Lisp side signal handlers cannot work.
326 The best solution is to start foreign threads with signals blocked,
327 but since third party libraries may create threads, it is not always
328 feasible to do so. As a workaround, upon receiving a signal in a
329 foreign thread, SBCL changes the thread's sigmask to block all signals
330 that it wants to handle and resends the signal to the current process
331 which should land in a thread that does not block it, that is, a Lisp
334 The resignalling trick cannot work for synchronously triggered signals
335 (SIGSEGV and co), take care not to trigger any. Resignalling for
336 synchronously triggered signals in foreign threads is subject to
337 @code{--lose-on-corruption}, see @ref{Runtime Options}.
339 @node Implementation (Linux x86/x86-64)
340 @comment node-name, next, previous, up
341 @section Implementation (Linux x86/x86-64)
343 Threading is implemented using pthreads and some Linux specific bits
346 On x86 the per-thread local bindings for special variables is achieved
347 using the %fs segment register to point to a per-thread storage area.
348 This may cause interesting results if you link to foreign code that
349 expects threading or creates new threads, and the thread library in
350 question uses %fs in an incompatible way. On x86-64 the r12 register
353 Queues require the @code{sys_futex()} system call to be available:
354 this is the reason for the NPTL requirement. We test at runtime that
355 this system call exists.
357 Garbage collection is done with the existing Conservative Generational
358 GC. Allocation is done in small (typically 8k) regions: each thread
359 has its own region so this involves no stopping. However, when a
360 region fills, a lock must be obtained while another is allocated, and
361 when a collection is required, all processes are stopped. This is
362 achieved by sending them signals, which may make for interesting
363 behaviour if they are interrupted in system calls. The streams
364 interface is believed to handle the required system call restarting
365 correctly, but this may be a consideration when making other blocking
366 calls e.g. from foreign library code.
368 Large amounts of the SBCL library have not been inspected for
369 thread-safety. Some of the obviously unsafe areas have large locks
370 around them, so compilation and fasl loading, for example, cannot be
371 parallelized. Work is ongoing in this area.
373 A new thread by default is created in the same POSIX process group and
374 session as the thread it was created by. This has an impact on
375 keyboard interrupt handling: pressing your terminal's intr key
376 (typically @kbd{Control-C}) will interrupt all processes in the
377 foreground process group, including Lisp threads that SBCL considers
378 to be notionally `background'. This is undesirable, so background
379 threads are set to ignore the SIGINT signal.
381 @code{sb-thread:make-listener-thread} in addition to creating a new
382 Lisp session makes a new POSIX session, so that pressing
383 @kbd{Control-C} in one window will not interrupt another listener -
384 this has been found to be embarrassing.