[Ecls-list] Multithreaded ECL
Juan Jose Garcia-Ripoll
worm at arrakis.es
Mon Nov 24 03:06:07 UTC 2003
Does anybody want to contribute to the multithreaded ECL project? Testers are
most welcome. I will regularly post big patch files (about 200k right now) at
http://ecls.sf.net/patch-current-mp.gz
which can be applied to the latest and very buggy release (ecl-0.9c.tar.gz),
but anonymous access to CVS is another option (with one day delay).
Currently, the features are:
* Multiprocessing via POSIX threads (currently available only under Linux).
* In the "MP" package you will find PROCESS-RUN-FUNCTION, PROCESS-KILL,
INTERRUPT-PROCESS, PROCESS-NAME, ALL-PROCESSES, MAKE-LOCK, GET-LOCK,
GIVEUP-LOCK, WITH-LOCK, WITHOUT-INTERRUPTS. Currently, lisp threads should
only be handled by ECL. ECL should not be invoked from threads which have not
been created by lisp (This will be solved in a near future).
* Dynamic bindings are inherited by children threads. For instance,
(let ((*a* 2))
(declare (special *a*))
(mp:process-run-function #'(lambda () (loop (sleep 1) (print *a*))))
here the value of *a* becomes the global value of *a* in the new thread. If
you do not use this, but
(defvar *a* 2)
(mp:process-run-function #'(lambda () (loop (sleep 1) (print *a*)))
then the value of *a* is common to both threads and one thread can change what
the other sees. Otherwise you will have to use this funny trick:
(defvar *a* "HOLA")
(let ((x (mp::process-run-function "TEST"
#'(lambda () (loop (sleep 1) (print *a*))))))
(sleep 10)
(mp::interrupt-process x #'(lambda () (setf *a* "ADIOS")))
(sleep 10)
(mp::process-kill x))
* Hash tables can be made thread safe by adding a keyword parameter ":lockable
t" to MAKE-HASH-TABLE. Otherwise, they can be corrupted and things may go
nuts.
* Arrays, structures and instances are not thread safe. Hmm, I should rather
say that "growing" them (or structural operations in general) are not safe in
these objects. Creating or modifying CLOS classes is also not thread safe,
and there might be speed issues in the use of methods (this has to be
investigated).
* Packages are safe in many ways. Both threads may add and remove symbols from
packages, and delete and create packages. Also streams should be safe (but
the pretty printer may get confused if someone else is writing to the same
stream)
* Loading and compiling files is protected with a global lock.
* Interrupts are the weakest point also in single-threaded ECL. I still have
to figure out how to support interrupts without breaking in the middle of
critical code. I also do not like the idea of executing interrupts
synchronously, but it is difficult to add checks for pending interrupts
throughout ECL. Maybe to defer signals, using alarm(), would be the wisest
thing.
Regards,
Juanjo
More information about the ecl-devel
mailing list