[armedbear-devel] destroy-thread and unwind-protect

James M. Lawrence llmjjmll at gmail.com
Wed Aug 8 19:36:17 UTC 2012


Yes, in the original bug report I am unaware that the thread isn't
interrupted in the first place, so whether or not cleanup forms are
executed is moot.

Also note a compiled (LOOP) is also impervious to interruption.

    (defun launch-and-destroy ()
      (let ((thread (threads:make-thread (lambda () (loop))))
        (sleep 0.5)
        (threads:destroy-thread thread)
        (sleep 0.5)))

    (compile 'launch-and-destroy)
    (print (threads:mapcar-threads #'threads:thread-alive-p))
    (launch-and-destroy)
    (print (threads:mapcar-threads #'threads:thread-alive-p))

output:

    (T)
    (T T)

Removing the COMPILE call produces the expected behavior.


On Wed, Aug 8, 2012 at 2:08 PM, Erik Huelsmann <ehuels at gmail.com> wrote:
> Hi all,
>
> Reviving an old thread because of some private discussion with James which
> spun off the LispWorks  users list.
>
> The comment by Alessio below is one that I've been wondering about for quite
> some time. What's our ThreadInterrupted "protocol"? Can we design one, if we
> can't deduce one from code base?
>
> I'm thinking about a protocol which works for the current code in the
> libraries as well as all code that the compiler generates. Reading up on the
> documentation for interrupts, it looks like we should be invoking
> Thread.interrupted() in random places to see if we've been interrupted.
> Presumably we need to do something with the interrupted information as well,
> then though.
>
> What more would there be to designing a protocol? We currently seem to be
> executing lambda expressions which get pushed into a thread-local queue.
> However, that's far from actually stopping the thread and destroying it.
>
> Well?
>
> Bye,
>
>
> Erik.
>
>
> On Mon, Oct 24, 2011 at 11:34 PM, Alessio Stalla <alessiostalla at gmail.com>
> wrote:
>>
>> On Sun, Oct 23, 2011 at 8:05 PM, James Lawrence <llmjjmll at gmail.com>
>> wrote:
>> >    (defun test-cleanup ()
>> >      (let* ((cleanedp nil)
>> >             (thread (threads:make-thread
>> >                      (lambda ()
>> >                        (unwind-protect (sleep 999)
>> >                          (setf cleanedp t))))))
>> >        (sleep 0.5)
>> >        (threads:destroy-thread thread)
>> >        (sleep 0.5)
>> >        cleanedp))
>> >
>> >    (test-cleanup)
>> >
>> > ABCL-1.0.0 and ABCL-0.27.0 return NIL.
>> >
>> > Other implementations I tested all return T -- Allegro, Clozure,
>> > LispWorks, SBCL (changing "threads" to "bordeaux-threads").
>> >
>> > Of course this isn't a bug since ABCL is free to do what it wishes.
>> > Does ABCL wish that?
>>
>> I don't think we should wish that. It's inconsistent not only with
>> other Lisp implementations, but with Java thread semantics as well.
>> The problems are two: first, that destroy-thread doesn't really
>> destroy the thread, it just sets a flag, so the sleep is not aborted
>> (when it ends, the next form is not evaluated and the thread just
>> terminates); second, that sleep swallows the ThreadInterrupted
>> exception anyway, so even if it were interrupted, the thread would
>> then continue normally.
>> I think thread-destroy should be reimplemented to call
>> Thread.interrupt() and that we should properly handle
>> InterruptedException as a Lisp condition.
>>
>> _______________________________________________
>> armedbear-devel mailing list
>> armedbear-devel at common-lisp.net
>> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel
>
>




More information about the armedbear-devel mailing list