[armedbear-devel] CLOS thread safety
David Kirkman
dkirkman at ucsd.edu
Mon Apr 26 18:36:46 UTC 2010
On Sat, Apr 24, 2010 at 9:17 AM, David Kirkman <dkirkman at ucsd.edu> wrote:
> 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.
>>
Here is a second example that reliably gives me an error. This
time, I only need two threads:
(defclass counter ()
((count :initform 0)))
(defun make-many (id)
#'(lambda ()
(dotimes (i 1000)
(make-instance 'counter))
(fresh-line)
(write-line (format nil "done with ~A" id))))
(progn
(threads:make-thread (make-many 'thread1))
(threads:make-thread (make-many 'thread2)))
This fails 100% of the time for me when I try to make 1000
instances, and about 25% of the time when I only try 100
instances, so if it does not give you an error try upping the
1000 by a factor of a few. I'm using a dual core G5 right now,
java 1.5.0_19 (it fails with both the client and the sever VM)
I now think that the original example is also failing because of
make-instance, which is why I have to use so many threads
to get an error.
-david
>
> 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.
>
> -david k.
>
More information about the armedbear-devel
mailing list