[armedbear-devel] CLOS thread safety

Tobias C. Rittweiler tcr at freebits.de
Sat Apr 24 16:44:06 UTC 2010


David Kirkman <dkirkman at ucsd.edu> writes:

> 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
>
> or
>
> Missing slot MOP::PRECEDENCE-LIST
>
>
> 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
> count-thread.
> 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.

There's a trick against the mangling. Use

  (fresh-line)
  (write-line (format nil <fmt-ctrl> . <fmt-args>))

HTH

  -T.





More information about the armedbear-devel mailing list