88 lines
2.1 KiB
Plaintext
88 lines
2.1 KiB
Plaintext
|
|
Threads
|
|
|
|
The following are exported by the THREADS structure.
|
|
|
|
(SPAWN thunk)
|
|
(SPAWN thunk name)
|
|
Create and schedule a new thread that will execute <thunk>. The optional
|
|
name is used when printing the thread.
|
|
|
|
(RELINQUISH-TIMESLICE)
|
|
Let other threads run for a while.
|
|
|
|
(SLEEP time)
|
|
Sleep for <time> milliseconds.
|
|
|
|
(TERMINATE-CURRENT-THREAD)
|
|
Kill the current thread.
|
|
|
|
(THREAD? thing)
|
|
#T if thing is a thread, #F otherwise.
|
|
|
|
(THREAD-NAME thread)
|
|
(THREAD-UID thread)
|
|
For printing debugging information.
|
|
|
|
-----
|
|
|
|
The following are exported by the LOCKS structure.
|
|
|
|
(MAKE-LOCK) => lock
|
|
(OBTAIN-LOCK lock)
|
|
(RELEASE-LOCK lock)
|
|
Locks are semaphores.
|
|
|
|
-----
|
|
|
|
The following are exported by the PLACEHOLDERS structure.
|
|
|
|
(MAKE-PLACEHOLDER) => placeholder
|
|
(PLACEHOLDER-VALUE placeholder) => value of placeholder
|
|
(PLACEHOLDER-SET! placeholder value)
|
|
(PLACEHOLDER? thing) => #t or #f
|
|
Attempts to reference a placeholder before it has been set cause the
|
|
referencing thread to block. Setting a placeholder to two different
|
|
values is an error. (Previous versions of Scheme 48 called these
|
|
`condition variables', which turn out to be somewhat different.)
|
|
|
|
-----
|
|
|
|
Threads and the command interpreter.
|
|
|
|
Each level of the command interpreter has its own set of active
|
|
threads. Moving to a new level, for example when an error occurs,
|
|
halts all threads belonging to the previous level. Resuming the
|
|
a level causes its associated threads to continue running.
|
|
|
|
The ,threads command inspects the threads running in the stopped
|
|
command level.
|
|
|
|
|
|
> ,open threads
|
|
> (define (foo) (sleep 1000) (display "Hi") (newline) (foo))
|
|
> (spawn foo 'my-thread)
|
|
> Hi
|
|
(begin (sleep 10000) (display "Done") (newline))
|
|
Hi
|
|
|
|
Interrupt: keyboard
|
|
1> (sleep 5000)
|
|
; note that the Hi thread doesn't run in this command level
|
|
1> ,proceed 0
|
|
Hi
|
|
; but it resumes when we resume this level
|
|
Hi
|
|
Done
|
|
> Hi
|
|
Hi
|
|
Hi
|
|
|
|
Interrupt: keyboard
|
|
1> ,threads
|
|
'(#{Thread 28 my-thread} #{Thread 27 command-loop})
|
|
|
|
[0] '#{Thread 28 my-thread}
|
|
[1] '#{Thread 27 command-loop}
|
|
inspect:
|