[plt-scheme] Re: Using LibFFI along with threads
On Jul 17, Hans Oesterholt-Dijkema wrote:
> The problem with C libraries is that they do not always provide
> callback scenarios, nor other ways to divide up functions in smaller
> parts to get some 'time slicing'.
You should have *some* way to synchronize threads in C -- my point was
that the one that is easiest to implement in C is the right solution.
BTW -- here's an alternative:
Creating a subprocess is easy, and probably not much more expensive
than a thread. Specifically, it sounds like you're paying enough
price for DB operations that the difference between a system thread
and a system process would be insignificant. So it should be quite
easy to do what you want to do by running a mzscheme subprocess, and
communicate with it using stdin/stdout. This way you don't need to
deal with ports, tcp, or sockets. The subprocess doesn't even need to
load any special files -- you can feed it the code you want. Here's a
simple sketch:
(define (async/channel form)
(let-values ([(p pout pin perr)
(subprocess #f #f (current-error-port)
(find-system-path 'run-file)
"-mve" (format "(write (let () ~s))" form))]
[(c) (make-channel)])
(close-output-port pin)
(thread (lambda ()
(channel-put c (read pout))
(unless (sync/timeout 10 p)
(subprocess-kill p #f)
(unless (sync/timeout 10 p)
(subprocess-kill p #t)))))
c))
and an example:
(define (run-fib n)
(async/channel `(begin (define (fib n)
(if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
(fib ,n))))
(map channel-get (map run-fib '(30 31 32 33)))
This can be made much better. (For example, you can send compiled
code over to the subprocess, you can add a mechanism that keeps
running processes around to avoid process creation overhead, you can
have state in threads, etc.)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!