[armedbear-devel] CLOS thread safety

David Kirkman dkirkman at ucsd.edu
Sat Apr 24 16:17:44 UTC 2010

On Sat, Apr 24, 2010 at 7:50 AM, Erik Huelsmann <ehuels at gmail.com> wrote:
> Can you share some examples which show the issues here? Adding
> thread-safety to clos.lisp - in specific, targeted places - should be
> well doable.

It was surprisingly difficult to create a fragment which would reproduce the
errors.  But here it is!

(defclass counter ()
  ((count :initform 0)))

(setf *ncount* 10000)
(setf *nthread* 1000)

(defun count-thread (amount)
  #'(lambda ()
      (let ((c (make-instance 'counter)))
        (dotimes (i *ncount*)
          (incf (slot-value c 'count) amount))
        (format t "count ~A = ~A~%" amount (slot-value c 'count)))))

(dotimes (i *nthread*)
  (threads:make-thread (count-thread i)))

On my machine, a half dozen or so threads will reliably die with either:

Missing slot MOP::NAME



The MOP::NAME error has about 5x more common than the
MOP::PRECEDENCE-LIST error.  The key to reproducing the error is to use a
lot of threads, with *nthread* = 2, the code can run all morning without any
trouble.  But it will eventually give an error:  I originally noticed
this with long
running code and two threads.  Even with *nthread* = 10, it works without error
most of the time.

It also works (I mean gives errors) if you drop the final format in
The format is not thread safe, but it does not seem to cause errors by
itself -- it
just mangles output -- and it helps to see which threads are finishing.

-david k.

More information about the armedbear-devel mailing list