Updates for the new thread stuff.
[bpt/guile.git] / doc / ref / api-scheduling.texi
1 @c -*-texinfo-*-
2 @c This is part of the GNU Guile Reference Manual.
3 @c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004
4 @c Free Software Foundation, Inc.
5 @c See the file guile.texi for copying conditions.
6
7 @page
8 @node Scheduling
9 @section Threads, Mutexes, Asyncs and Dynamic Roots
10
11 [FIXME: This is pasted in from Tom Lord's original guile.texi chapter
12 plus the Cygnus programmer's manual; it should be *very* carefully
13 reviewed and largely reorganized.]
14
15 @menu
16 * Arbiters:: Synchronization primitives.
17 * Asyncs:: Asynchronous procedure invocation.
18 * Continuation Barriers:: Protection from non-local control flow.
19 * Threads:: Multiple threads of execution.
20 * Blocking:: How to block properly in guile mode.
21 * Fluids and Dynamic States:: Thread-local variables, etc.
22 * Futures:: Delayed execution in new threads.
23 * Parallel Forms:: Parallel execution of forms.
24 * Mutexes and Condition Variables:: Synchronization primitives.
25 @end menu
26
27
28 @node Arbiters
29 @subsection Arbiters
30 @cindex arbiters
31
32 Arbiters are synchronization objects, they can be used by threads to
33 control access to a shared resource. An arbiter can be locked to
34 indicate a resource is in use, and unlocked when done.
35
36 An arbiter is like a light-weight mutex (@pxref{Mutexes and Condition
37 Variables}). It uses less memory and may be faster, but there's no
38 way for a thread to block waiting on an arbiter, it can only test and
39 get the status returned.
40
41 @deffn {Scheme Procedure} make-arbiter name
42 @deffnx {C Function} scm_make_arbiter (name)
43 Return an object of type arbiter and name @var{name}. Its
44 state is initially unlocked. Arbiters are a way to achieve
45 process synchronization.
46 @end deffn
47
48 @deffn {Scheme Procedure} try-arbiter arb
49 @deffnx {C Function} scm_try_arbiter (arb)
50 @deffnx {C Function} scm_try_arbiter (arb)
51 If @var{arb} is unlocked, then lock it and return @code{#t}.
52 If @var{arb} is already locked, then do nothing and return
53 @code{#f}.
54 @end deffn
55
56 @deffn {Scheme Procedure} release-arbiter arb
57 @deffnx {C Function} scm_release_arbiter (arb)
58 If @var{arb} is locked, then unlock it and return @code{#t}. If
59 @var{arb} is already unlocked, then do nothing and return @code{#f}.
60
61 Typical usage is for the thread which locked an arbiter to later
62 release it, but that's not required, any thread can release it.
63 @end deffn
64
65
66 @node Asyncs
67 @subsection Asyncs
68
69 @cindex asyncs
70 @cindex user asyncs
71 @cindex system asyncs
72
73 Asyncs are a means of deferring the excution of Scheme code until it is
74 safe to do so.
75
76 Guile provides two kinds of asyncs that share the basic concept but are
77 otherwise quite different: system asyncs and user asyncs. System asyncs
78 are integrated into the core of Guile and are executed automatically
79 when the system is in a state to allow the execution of Scheme code.
80 For example, it is not possible to execute Scheme code in a POSIX signal
81 handler, but such a signal handler can queue a system async to be
82 executed in the near future, when it is safe to do so.
83
84 System asyncs can also be queued for threads other than the current one.
85 This way, you can cause threads to asynchronously execute arbitrary
86 code.
87
88 User asyncs offer a convenient means of queueing procedures for future
89 execution and triggering this execution. They will not be executed
90 automatically.
91
92 @menu
93 * System asyncs::
94 * User asyncs::
95 @end menu
96
97 @node System asyncs
98 @subsubsection System asyncs
99
100 To cause the future asynchronous execution of a procedure in a given
101 thread, use @code{system-async-mark}.
102
103 Automatic invocation of system asyncs can be temporarily disabled by
104 calling @code{call-with-blocked-asyncs}. This function works by
105 temporarily increasing the @emph{async blocking level} of the current
106 thread while a given procedure is running. The blocking level starts
107 out at zero, and whenever a safe point is reached, a blocking level
108 greater than zero will prevent the execution of queued asyncs.
109
110 Analogously, the procedure @code{call-with-unblocked-asyncs} will
111 temporarily decrease the blocking level of the current thread. You
112 can use it when you want to disable asyncs by default and only allow
113 them temporarily.
114
115 In addition to the C versions of @code{call-with-blocked-asyncs} and
116 @code{call-with-unblocked-asyncs}, C code can use
117 @code{scm_frame_block_asyncs} and @code{scm_frame_unblock_asyncs}
118 inside a @dfn{frame} (@pxref{Frames}) to block or unblock system asyncs
119 temporarily.
120
121 @deffn {Scheme Procedure} system-async-mark proc [thread]
122 @deffnx {C Function} scm_system_async_mark (proc)
123 @deffnx {C Function} scm_system_async_mark_for_thread (proc, thread)
124 Mark @var{proc} (a procedure with zero arguments) for future execution
125 in @var{thread}. When @var{proc} has already been marked for
126 @var{thread} but has not been executed yet, this call has no effect.
127 When @var{thread} is omitted, the thread that called
128 @code{system-async-mark} is used.
129
130 This procedure is not safe to be called from signal handlers. Use
131 @code{scm_sigaction} or @code{scm_sigaction_for_thread} to install
132 signal handlers.
133 @end deffn
134
135 @c FIXME: The use of @deffnx for scm_c_call_with_blocked_asyncs and
136 @c scm_c_call_with_unblocked_asyncs puts "void" into the function
137 @c index. Would prefer to use @deftypefnx if makeinfo allowed that,
138 @c or a @deftypefn with an empty return type argument if it didn't
139 @c introduce an extra space.
140
141 @deffn {Scheme Procedure} call-with-blocked-asyncs proc
142 @deffnx {C Function} scm_call_with_blocked_asyncs (proc)
143 @deffnx {C Function} void *scm_c_call_with_blocked_asyncs (void * (*proc) (void *data), void *data)
144 @findex scm_c_call_with_blocked_asyncs
145 Call @var{proc} and block the execution of system asyncs by one level
146 for the current thread while it is running. Return the value returned
147 by @var{proc}. For the first two variants, call @var{proc} with no
148 arguments; for the third, call it with @var{data}.
149 @end deffn
150
151 @deffn {Scheme Procedure} call-with-unblocked-asyncs proc
152 @deffnx {C Function} scm_call_with_unblocked_asyncs (proc)
153 @deffnx {C Function} void *scm_c_call_with_unblocked_asyncs (void *(*p) (void *d), void *d)
154 @findex scm_c_call_with_unblocked_asyncs
155 Call @var{proc} and unblock the execution of system asyncs by one
156 level for the current thread while it is running. Return the value
157 returned by @var{proc}. For the first two variants, call @var{proc}
158 with no arguments; for the third, call it with @var{data}.
159 @end deffn
160
161 @deftypefn {C Function} void scm_frame_block_asyncs ()
162 This function must be used inside a pair of calls to
163 @code{scm_frame_begin} and @code{scm_frame_end} (@pxref{Frames}).
164 During the dynamic extent of the frame, asyncs are blocked by one level.
165 @end deftypefn
166
167 @deftypefn {C Function} void scm_frame_unblock_asyncs ()
168 This function must be used inside a pair of calls to
169 @code{scm_frame_begin} and @code{scm_frame_end} (@pxref{Frames}).
170 During the dynamic extent of the frame, asyncs are unblocked by one
171 level.
172 @end deftypefn
173
174 @node User asyncs
175 @subsubsection User asyncs
176
177 A user async is a pair of a thunk (a parameterless procedure) and a
178 mark. Setting the mark on a user async will cause the thunk to be
179 executed when the user async is passed to @code{run-asyncs}. Setting
180 the mark more than once is satisfied by one execution of the thunk.
181
182 User asyncs are created with @code{async}. They are marked with
183 @code{async-mark}.
184
185 @deffn {Scheme Procedure} async thunk
186 @deffnx {C Function} scm_async (thunk)
187 Create a new user async for the procedure @var{thunk}.
188 @end deffn
189
190 @deffn {Scheme Procedure} async-mark a
191 @deffnx {C Function} scm_async_mark (a)
192 Mark the user async @var{a} for future execution.
193 @end deffn
194
195 @deffn {Scheme Procedure} run-asyncs list_of_a
196 @deffnx {C Function} scm_run_asyncs (list_of_a)
197 Execute all thunks from the marked asyncs of the list @var{list_of_a}.
198 @end deffn
199
200 @node Continuation Barriers
201 @subsection Continuation Barriers
202
203 The non-local flow of control caused by continuations might sometimes
204 not be wanted. You can use @code{with-continuation-barrier} etc to
205 errect fences that continuations can not pass.
206
207 @deffn {Sheme Procedure} with-continuation-barrier proc
208 @deffnx {C Function} scm_with_continuation_barrier (proc)
209 Call @var{proc} and return its result. Do not allow the invocation of
210 continuations that would leave or enter the dynamic extent of the call
211 to @code{with-continuation-barrier}. Such an attempt causes an error
212 to be signaled.
213
214 Throws (such as errors) that are not caught from within @var{proc} are
215 caught by @code{with-continuation-barrier}. In that case, a short
216 message is printed to the current error port and @code{#f} is returned.
217
218 Thus, @code{with-continuation-barrier} returns exactly once.
219 @end deffn
220
221 @deftypefn {C Function} void *scm_c_with_continuation_barrier (void *(*func) (void *), void *data)
222 Like @code{scm_with_continuation_barrier} but call @var{func} on
223 @var{data}. When an error is caught, @code{NULL} is returned.
224 @end deftypefn
225
226 @node Threads
227 @subsection Threads
228 @cindex threads
229 @cindex Guile threads
230 @cindex POSIX threads
231
232 @deffn {Scheme Procedure} all-threads
233 @deffnx {C Function} scm_all_threads ()
234 Return a list of all threads.
235 @end deffn
236
237 @deffn {Scheme Procedure} current-thread
238 @deffnx {C Function} scm_current_thread ()
239 Return the thread that called this function.
240 @end deffn
241
242 @c begin (texi-doc-string "guile" "call-with-new-thread")
243 @deffn {Scheme Procedure} call-with-new-thread thunk handler
244 Call @code{thunk} in a new thread and with a new dynamic state,
245 returning the new thread. The procedure @var{thunk} is called via
246 @code{with-continuation-barrier}.
247
248 When @var{handler} is specified, then @var{thunk} is called from
249 within a @code{catch} with tag @code{#t} that has @var{handler} as its
250 handler. This catch is established inside the continuation barrier.
251
252 Once @var{thunk} or @var{handler} returns, the return value is made
253 the @emph{exit value} of the thread and the thread is terminated.
254 @end deffn
255
256 @deftypefn {C Function} SCM scm_spawn_thread (scm_t_catch_body body, void *body_data, scm_t_catch_handler handler, void *handler_data)
257 Call @var{body} in a new thread, passing it @var{body_data}, returning
258 the new thread. The function @var{body} is called via
259 @code{scm_c_with_continuation_barrier}.
260
261 When @var{handler} is non-@code{NULL}, @var{body} is called via
262 @code{scm_internal_catch} with tag @code{SCM_BOOL_T} that has
263 @var{handler} and @var{handler_data} as the handler and its data. This
264 catch is established inside the continuation barrier.
265
266 Once @var{body} or @var{handler} returns, the return value is made the
267 @emph{exit value} of the thread and the thread is terminated.
268 @end deftypefn
269
270 @c begin (texi-doc-string "guile" "join-thread")
271 @deffn {Scheme Procedure} join-thread thread
272 Wait for @var{thread} to terminate and return its exit value. Threads
273 that have not been created with @code{call-with-new-thread} or
274 @code{scm_spawn_thread} have an exit value of @code{#f}.
275 @end deffn
276
277 @deffn {Scheme Procedure} thread-exited? thread
278 @deffnx {C Function} scm_thread_exited_p (thread)
279 Return @code{#t} iff @var{thread} has exited.
280 @end deffn
281
282 @c begin (texi-doc-string "guile" "yield")
283 @deffn {Scheme Procedure} yield
284 If one or more threads are waiting to execute, calling yield forces an
285 immediate context switch to one of them. Otherwise, yield has no effect.
286 @end deffn
287
288 Higher level thread procedures are available by loading the
289 @code{(ice-9 threads)} module. These provide standardized
290 thread creation.
291
292 @deffn macro make-thread proc [args@dots{}]
293 Apply @var{proc} to @var{args} in a new thread formed by
294 @code{call-with-new-thread} using a default error handler that display
295 the error to the current error port. The @var{args@dots{}}
296 expressions are evaluated in the new thread.
297 @end deffn
298
299 @deffn macro begin-thread first [rest@dots{}]
300 Evaluate forms @var{first} and @var{rest} in a new thread formed by
301 @code{call-with-new-thread} using a default error handler that display
302 the error to the current error port.
303 @end deffn
304
305 @node Blocking
306 @subsection Blocking in Guile Mode
307
308 A thread must not block outside of a libguile function while it is in
309 guile mode. The following functions can be used to temporily leave
310 guile mode or to perform some common blocking operations in a supported
311 way.
312
313 @deftypefn {C Function} scm_t_guile_ticket scm_leave_guile ()
314 Leave guile mode and return a ticket that can be used with
315 @code{scm_enter_guile} to enter it again.
316
317 While a thread has left guile mode, it must not call any libguile
318 functions except @code{scm_enter_guile} and must not use any libguile
319 macros. Also, local variables of type @code{SCM} that are allocated
320 while not in guile mode are not protected from the garbage collector.
321 @end deftypefn
322
323 @deftypefn {C Function} void scm_enter_guile (scm_t_guile_ticket ticket)
324 Enter guile mode again.
325 @end deftypefn
326
327 @deftypefn {C Function} void *scm_without_guile (void *(*func) (void *), void *data)
328 Leave guile mode, call @var{func} on @var{data}, enter guile mode and
329 return the result of calling @var{func}.
330 @end deftypefn
331
332 @deftypefn {C Function} int scm_pthread_mutex_lock (pthread_mutex_t *mutex)
333 Like @code{pthread_mutex_lock}, but leaves guile mode while waiting for
334 the mutex.
335 @end deftypefn
336
337 @deftypefn {C Function} int scm_pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
338 @deftypefnx {C Function} int scm_pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *abstime)
339 Like @code{pthread_cond_wait} and @code{pthread_cond_timedwait}, but
340 leaves guile mode while waiting for the condition variable.
341 @end deftypefn
342
343 @deftypefn {C Function} int scm_std_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
344 Like @code{select} but leaves guile mode while waiting. Also, the
345 delivery of a system async causes this function to be interrupted with
346 error code @code{EINTR}.
347 @end deftypefn
348
349 @deftypefn {C Function} {unsigned int} scm_std_sleep ({unsigned int} seconds)
350 Like @code{sleep}, but leaves guile mode while sleeping. Also, the
351 delivery of a system async causes this function to be interrupted.
352 @end deftypefn
353
354 @deftypefn {C Function} {unsigned long} scm_std_usleep ({unsigned long} usecs)
355 Like @code{usleep}, but leaves guile mode while sleeping. Also, the
356 delivery of a system async causes this function to be interrupted.
357 @end deftypefn
358
359
360 @node Fluids and Dynamic States
361 @subsection Fluids and Dynamic States
362
363 @cindex fluids
364
365 A @emph{fluid} is an object that can store one value per @emph{dynamic
366 state}. Each thread has a current dynamic state, and when accessing a
367 fluid, this current dynamic state is used to provide the actual value.
368 In this way, fluids can be used for thread local storage, but they are
369 in fact more flexible: dynamic states are objects of their own and can
370 be made current for more than one thread at the same time, or only be
371 made current temporarily, for example.
372
373 Fluids can also be used to simulate the desirable effects of
374 dynamically scoped variables. Dynamically scoped variables are useful
375 when you want to set a variable to a value during some dynamic extent
376 in the execution of your program and have them revert to their
377 original value when the control flow is outside of this dynamic
378 extent. See the description of @code{with-fluids} below for details.
379
380 New fluids are created with @code{make-fluid} and @code{fluid?} is
381 used for testing whether an object is actually a fluid. The values
382 stored in a fluid can be accessed with @code{fluid-ref} and
383 @code{fluid-set!}.
384
385 @deffn {Scheme Procedure} make-fluid
386 @deffnx {C Function} scm_make_fluid ()
387 Return a newly created fluid.
388 Fluids are objects that can hold one
389 value per dynamic state. That is, modifications to this value are
390 only visible to code that executes with the same dynamic state as
391 the modifying code. When a new dynamic state is constructed, it
392 inherits the values from its parent. Because each thread normally executes
393 with its own dynamic state, you can use fluids for thread local storage.
394 @end deffn
395
396 @deffn {Scheme Procedure} fluid? obj
397 @deffnx {C Function} scm_fluid_p (obj)
398 Return @code{#t} iff @var{obj} is a fluid; otherwise, return
399 @code{#f}.
400 @end deffn
401
402 @deffn {Scheme Procedure} fluid-ref fluid
403 @deffnx {C Function} scm_fluid_ref (fluid)
404 Return the value associated with @var{fluid} in the current
405 dynamic root. If @var{fluid} has not been set, then return
406 @code{#f}.
407 @end deffn
408
409 @deffn {Scheme Procedure} fluid-set! fluid value
410 @deffnx {C Function} scm_fluid_set_x (fluid, value)
411 Set the value associated with @var{fluid} in the current dynamic root.
412 @end deffn
413
414 @code{with-fluids*} temporarily changes the values of one or more fluids,
415 so that the given procedure and each procedure called by it access the
416 given values. After the procedure returns, the old values are restored.
417
418 @deffn {Scheme Procedure} with-fluid* fluid value thunk
419 @deffnx {C Function} scm_with_fluid (fluid, value, thunk)
420 Set @var{fluid} to @var{value} temporarily, and call @var{thunk}.
421 @var{thunk} must be a procedure with no argument.
422 @end deffn
423
424 @deffn {Scheme Procedure} with-fluids* fluids values thunk
425 @deffnx {C Function} scm_with_fluids (fluids, values, thunk)
426 Set @var{fluids} to @var{values} temporary, and call @var{thunk}.
427 @var{fluids} must be a list of fluids and @var{values} must be the
428 same number of their values to be applied. Each substitution is done
429 in the order given. @var{thunk} must be a procedure with no argument.
430 it is called inside a @code{dynamic-wind} and the fluids are
431 set/restored when control enter or leaves the established dynamic
432 extent.
433 @end deffn
434
435 @deffn {Scheme Macro} with-fluids ((fluid value) ...) body...
436 Execute @var{body...} while each @var{fluid} is set to the
437 corresponding @var{value}. Both @var{fluid} and @var{value} are
438 evaluated and @var{fluid} must yield a fluid. @var{body...} is
439 executed inside a @code{dynamic-wind} and the fluids are set/restored
440 when control enter or leaves the established dynamic extent.
441 @end deffn
442
443 @deftypefn {C Function} SCM scm_c_with_fluids (SCM fluids, SCM vals, SCM (*cproc)(void *), void *data)
444 @deftypefnx {C Function} SCM scm_c_with_fluid (SCM fluid, SCM val, SCM (*cproc)(void *), void *data)
445 The function @code{scm_c_with_fluids} is like @code{scm_with_fluids}
446 except that it takes a C function to call instead of a Scheme thunk.
447
448 The function @code{scm_c_with_fluid} is similar but only allows one
449 fluid to be set instead of a list.
450 @end deftypefn
451
452 @deftypefn {C Function} void scm_frame_fluid (SCM fluid, SCM val)
453 This function must be used inside a pair of calls to
454 @code{scm_frame_begin} and @code{scm_frame_end} (@pxref{Frames}).
455 During the dynamic extent of the frame, the fluid @var{fluid} is set
456 to @var{val}.
457
458 More precisely, the value of the fluid is swapped with a `backup'
459 value whenever the frame is entered or left. The backup value is
460 initialized with the @var{val} argument.
461 @end deftypefn
462
463 @deffn {Scheme Procedure} make-dynamic-state [parent]
464 @deffnx {C Function} scm_make_dynamic_state (parent)
465 Return a copy of the dynamic state object @var{parent}
466 or of the current dynamic state when @var{parent} is omitted.
467 @end deffn
468
469 @deffn {Scheme Procedure} dynamic-state? obj
470 @deffnx {C Function} scm_dynamic_state_p (obj)
471 Return @code{#t} if @var{obj} is a dynamic state object;
472 return @code{#f} otherwise.
473 @end deffn
474
475 @deftypefn {C Procedure} int scm_is_dynamic_state (SCM obj)
476 Return non-zero if @var{obj} is a dynamic state object;
477 return zero otherwise.
478 @end deftypefn
479
480 @deffn {Scheme Procedure} current-dynamic-state
481 @deffnx {C Function} scm_current_dynamic_state ()
482 Return the current dynamic state object.
483 @end deffn
484
485 @deffn {Scheme Procedure} set-current-dynamic-state state
486 @deffnx {C Function} scm_set_current_dynamic_state (state)
487 Set the current dynamic state object to @var{state}
488 and return the previous current dynamic state object.
489 @end deffn
490
491 @deffn {Scheme Procedure} with-dynamic-state state proc
492 @deffnx {C Function} scm_with_dynamic_state (state, proc)
493 Call @var{proc} while @var{state} is the current dynamic
494 state object.
495 @end deffn
496
497 @deftypefn {C Procedure} void scm_frame_current_dynamic_state (SCM state)
498 Set the current dynamic state to @var{state} for the dynamic extent of
499 the current frame.
500 @end deftypefn
501
502 @deftypefn {C Procedure} void *scm_c_with_dynamic_state (SCM state, void *(*func)(void *), void *data)
503 Like @code{scm_with_dynamic_state}, but call @var{func} with
504 @var{data}.
505 @end deftypefn
506
507 @node Futures
508 @subsection Futures
509 @cindex futures
510
511 Futures are a convenient way to run a calculation in a new thread, and
512 only wait for the result when it's actually needed.
513
514 Futures are similar to promises (@pxref{Delayed Evaluation}), in that
515 they allow mainline code to continue immediately. But @code{delay}
516 doesn't evaluate at all until forced, whereas @code{future} starts
517 immediately in a new thread.
518
519 @deffn {syntax} future expr
520 Begin evaluating @var{expr} in a new thread, and return a ``future''
521 object representing the calculation.
522 @end deffn
523
524 @deffn {Scheme Procedure} make-future thunk
525 @deffnx {C Function} scm_make_future (thunk)
526 Begin evaluating the call @code{(@var{thunk})} in a new thread, and
527 return a ``future'' object representing the calculation.
528 @end deffn
529
530 @deffn {Scheme Procedure} future-ref f
531 @deffnx {C Function} scm_future_ref (f)
532 Return the value computed by the future @var{f}. If @var{f} has not
533 yet finished executing then wait for it to do so.
534 @end deffn
535
536
537 @node Parallel Forms
538 @subsection Parallel forms
539 @cindex parallel forms
540
541 The functions described in this section are available from
542
543 @example
544 (use-modules (ice-9 threads))
545 @end example
546
547 @deffn syntax parallel expr1 @dots{} exprN
548 Evaluate each @var{expr} expression in parallel, each in its own thread.
549 Return the results as a set of @var{N} multiple values
550 (@pxref{Multiple Values}).
551 @end deffn
552
553 @deffn syntax letpar ((var1 expr1) @dots{} (varN exprN)) body@dots{}
554 Evaluate each @var{expr} in parallel, each in its own thread, then bind
555 the results to the corresponding @var{var} variables and evaluate
556 @var{body}.
557
558 @code{letpar} is like @code{let} (@pxref{Local Bindings}), but all the
559 expressions for the bindings are evaluated in parallel.
560 @end deffn
561
562 @deffn {Scheme Procedure} par-map proc lst1 @dots{} lstN
563 @deffnx {Scheme Procedure} par-for-each proc lst1 @dots{} lstN
564 Call @var{proc} on the elements of the given lists. @code{par-map}
565 returns a list comprising the return values from @var{proc}.
566 @code{par-for-each} returns an unspecified value, but waits for all
567 calls to complete.
568
569 The @var{proc} calls are @code{(@var{proc} @var{elem1} @dots{}
570 @var{elemN})}, where each @var{elem} is from the corresponding
571 @var{lst}. Each @var{lst} must be the same length. The calls are
572 made in parallel, each in its own thread.
573
574 These functions are like @code{map} and @code{for-each} (@pxref{List
575 Mapping}), but make their @var{proc} calls in parallel.
576 @end deffn
577
578 @deffn {Scheme Procedure} n-par-map n proc lst1 @dots{} lstN
579 @deffnx {Scheme Procedure} n-par-for-each n proc lst1 @dots{} lstN
580 Call @var{proc} on the elements of the given lists, in the same way as
581 @code{par-map} and @code{par-for-each} above, but use no more than
582 @var{n} threads at any one time. The order in which calls are
583 initiated within that threads limit is unspecified.
584
585 These functions are good for controlling resource consumption if
586 @var{proc} calls might be costly, or if there are many to be made. On
587 a dual-CPU system for instance @math{@var{n}=4} might be enough to
588 keep the CPUs utilized, and not consume too much memory.
589 @end deffn
590
591 @deffn {Scheme Procedure} n-for-each-par-map n sproc pproc lst1 @dots{} lstN
592 Apply @var{pproc} to the elements of the given lists, and apply
593 @var{sproc} to each result returned by @var{pproc}. The final return
594 value is unspecified, but all calls will have been completed before
595 returning.
596
597 The calls made are @code{(@var{sproc} (@var{pproc} @var{elem1} @dots{}
598 @var{elemN}))}, where each @var{elem} is from the corresponding
599 @var{lst}. Each @var{lst} must have the same number of elements.
600
601 The @var{pproc} calls are made in parallel, in separate threads. No more
602 than @var{n} threads are used at any one time. The order in which
603 @var{pproc} calls are initiated within that limit is unspecified.
604
605 The @var{sproc} calls are made serially, in list element order, one at
606 a time. @var{pproc} calls on later elements may execute in parallel
607 with the @var{sproc} calls. Exactly which thread makes each
608 @var{sproc} call is unspecified.
609
610 This function is designed for individual calculations that can be done
611 in parallel, but with results needing to be handled serially, for
612 instance to write them to a file. The @var{n} limit on threads
613 controls system resource usage when there are many calculations or
614 when they might be costly.
615
616 It will be seen that @code{n-for-each-par-map} is like a combination
617 of @code{n-par-map} and @code{for-each},
618
619 @example
620 (for-each sproc (n-par-map n pproc lst1 ... lstN))
621 @end example
622
623 @noindent
624 But the actual implementation is more efficient since each @var{sproc}
625 call, in turn, can be initiated once the relevant @var{pproc} call has
626 completed, it doesn't need to wait for all to finish.
627 @end deffn
628
629
630 @node Mutexes and Condition Variables
631 @subsection Mutexes and Condition Variables
632 @cindex mutex
633 @cindex condition variable
634
635 A mutex is a thread synchronization object, it can be used by threads
636 to control access to a shared resource. A mutex can be locked to
637 indicate a resource is in use, and other threads can then block on the
638 mutex to wait for the resource (or can just test and do something else
639 if not available). ``Mutex'' is short for ``mutual exclusion''.
640
641 There are two types of mutexes in Guile, ``standard'' and
642 ``recursive''. They're created by @code{make-mutex} and
643 @code{make-recursive-mutex} respectively, the operation functions are
644 then common to both.
645
646 Note that for both types of mutex there's no protection against a
647 ``deadly embrace''. For instance if one thread has locked mutex A and
648 is waiting on mutex B, but another thread owns B and is waiting on A,
649 then an endless wait will occur (in the current implementation).
650 Acquiring requisite mutexes in a fixed order (like always A before B)
651 in all threads is one way to avoid such problems.
652
653 @sp 1
654 @deffn {Scheme Procedure} make-mutex
655 Return a new standard mutex. It is initially unlocked.
656 @end deffn
657
658 @deffn {Scheme Procedure} make-recursive-mutex
659 Return a new recursive mutex. It is initialloy unlocked.
660 @end deffn
661
662 @deffn {Scheme Procedure} lock-mutex mutex
663 Lock @var{mutex}. If the mutex is already locked by another thread
664 then block and return only when @var{mutex} has been acquired.
665
666 For standard mutexes (@code{make-mutex}), and error is signalled if
667 the thread has itself already locked @var{mutex}.
668
669 For a recursive mutex (@code{make-recursive-mutex}), if the thread has
670 itself already locked @var{mutex}, then a further @code{lock-mutex}
671 call increments the lock count. An additional @code{unlock-mutex}
672 will be required to finally release.
673
674 When a system async (@pxref{System asyncs}) is activated for a thread
675 blocked in @code{lock-mutex}, the wait is interrupted and the async is
676 executed. When the async returns, the wait resumes.
677 @end deffn
678
679 @deffn {Scheme Procedure} try-mutex mutex
680 Try to lock @var{mutex} as per @code{lock-mutex}. If @var{mutex} can
681 be acquired immediately then this is done and the return is @code{#t}.
682 If @var{mutex} is locked by some other thread then nothing is done and
683 the return is @code{#f}.
684 @end deffn
685
686 @deffn {Scheme Procedure} unlock-mutex mutex
687 Unlock @var{mutex}. An error is signalled if @var{mutex} is not
688 locked by the calling thread.
689 @end deffn
690
691 @c begin (texi-doc-string "guile" "make-condition-variable")
692 @deffn {Scheme Procedure} make-condition-variable
693 Return a new condition variable.
694 @end deffn
695
696 @c begin (texi-doc-string "guile" "wait-condition-variable")
697 @deffn {Scheme Procedure} wait-condition-variable cond-var mutex [time]
698 Wait until @var{cond-var} has been signalled. While waiting,
699 @var{mutex} is atomically unlocked (as with @code{unlock-mutex}) and
700 is locked again when this function returns. When @var{time} is given,
701 it specifies a point in time where the waiting should be aborted. It
702 can be either a integer as returned by @code{current-time} or a pair
703 as returned by @code{gettimeofday}. When the waiting is aborted,
704 @code{#f} is returned. When the condition variable has in fact been
705 signalled, @code{#t} is returned. The mutex is re-locked in any case
706 before @code{wait-condition-variable} returns.
707
708 When a system async is activated for a thread that is blocked in a
709 call to @code{wait-condition-variable}, the waiting is interrupted,
710 the mutex is locked, and the async is executed. When the async
711 returns, the mutex is unlocked again and the waiting is resumed. When
712 the thread block while re-acquiring the mutex, execution of asyncs is
713 blocked.
714 @end deffn
715
716 @c begin (texi-doc-string "guile" "signal-condition-variable")
717 @deffn {Scheme Procedure} signal-condition-variable cond-var
718 Wake up one thread that is waiting for @var{cv}.
719 @end deffn
720
721 @c begin (texi-doc-string "guile" "broadcast-condition-variable")
722 @deffn {Scheme Procedure} broadcast-condition-variable cond-var
723 Wake up all threads that are waiting for @var{cv}.
724 @end deffn
725
726 @sp 1
727 The following are higher level operations on mutexes. These are
728 available from
729
730 @example
731 (use-modules (ice-9 threads))
732 @end example
733
734 @deffn macro with-mutex mutex [body@dots{}]
735 Lock @var{mutex}, evaluate the @var{body} forms, then unlock
736 @var{mutex}. The return value is the return from the last @var{body}
737 form.
738
739 The lock, body and unlock form the branches of a @code{dynamic-wind}
740 (@pxref{Dynamic Wind}), so @var{mutex} is automatically unlocked if an
741 error or new continuation exits @var{body}, and is re-locked if
742 @var{body} is re-entered by a captured continuation.
743 @end deffn
744
745 @deffn macro monitor body@dots{}
746 Evaluate the @var{body} forms, with a mutex locked so only one thread
747 can execute that code at any one time. The return value is the return
748 from the last @var{body} form.
749
750 Each @code{monitor} form has its own private mutex and the locking and
751 evaluation is as per @code{with-mutex} above. A standard mutex
752 (@code{make-mutex}) is used, which means @var{body} must not
753 recursively re-enter the @code{monitor} form.
754
755 The term ``monitor'' comes from operating system theory, where it
756 means a particular bit of code managing access to some resource and
757 which only ever executes on behalf of one process at any one time.
758 @end deffn
759
760
761 @c Local Variables:
762 @c TeX-master: "guile.texi"
763 @c End: