[gambit-list] Thread undocumented features...
Marc Feeley
feeley at iro.umontreal.ca
Tue Sep 1 14:36:44 EDT 2009
On 1-Sep-09, at 1:58 PM, David St-Hilaire wrote:
> Hi all!
>
> I address this message to Marc, but I thought it might interest
> others so I
> cc'ed it to the gambit list ;).
>
> What is the difference between the undocumented thread-interrupt! and
> thread-suspend! functions? Is it possible to retrieve an interrupted
> thread's
> continuation?
>
> Basically I want to know if its possible to do something like:
>
> (let ((t (make-thread
> (lambda () (let loop ((i 0)) (write 'o_O) (loop (+ i 1)))))))
> (thread-start! t)
> (thread-sleep! 0.5)
> (thread-interrupt!/suspend! t)
> (let ((k (get-the-continuation t)))
> (continuation-graft k (lambda (r) i))))
>
> I don't know if this pseudo code is clear enough to illustrate my
> needs? I'd
> like to stop another thread and use continuation-graft to execute
> some code on
> it's stack.
How about:
(thread-interrupt t (lambda () ...))
The thunk will be executed by thread t, in the middle of its execution
(in other words thread t is interrupted and made to run the thunk
within the thread's continuation).
For example:
% gsi
Gambit v4.5.1
> (define t (thread-start!
(make-thread
(lambda ()
(let ((n 0))
(let loop () (set! n (+ n 1)) (loop)))))))
> (thread-interrupt!
t
(lambda ()
(continuation-capture
(lambda (c)
(display-continuation-backtrace c (repl-output-port) #t
#t)))))
> 0 ##thread-interrupt!
1 loop (console)@1:76 (begin (set! n (+ n
1)) (...
loop = (lambda () (set! n (+ n 1)) (loop))
n = 27001012
2 ##thread-start-action!
,q
Marc
More information about the Gambit-list
mailing list