[c++-pthreads] Restating the Jason model

Wil Evers wil at bogo.xs4all.nl
Tue Jan 13 12:44:39 UTC 2004


Jason Merrill wrote:

> I think this is an appropriate time to restate my proposal.  I think
> there's a fair amount of consensus around these three points:
> 
>  * Cancellation is a normal exception.
>  * If a cancellation exception is destroyed, the cancellation request
>    is re-entered, and acted on again at the next cancellation point.

I can't help wondering about the difference between this design and 
Nathan's sticky cancellation model.  It seems to me that in your model, 
I can do something like:

   catch (const cancellation_request&) {
     some_socket.write("Thread cancelled\n");
   }

and expect the write operation to succeed, whereas in Nathan's sticky 
cancellation design, the write operation will throw another 
cancellation_request (unless, of course, I disable cancellation in the 
catch block).  If so, is this intentional?

And what about this one:

   try {
     some_socket.connect("www.ibm.com");
   } catch (const cancellation_request&) {
     throw my_fancy_exception(__FILE__, __LINE__,
       "Cancellation request");
   }

Here, unwinding continues, but the cancellation request is mapped onto 
some other - presumably legacy - exception hierarchy.  Do we really want 
the cancellation request to be re-entered here?

To me, it seems like Nathan's sticky cancellation model uses a 
tried-and-tested design - it simply puts the thread object into an error 
state, causing subsequent operations to fail - whereas your design is 
quite innovative.  I'm not suggesting there is anything wrong with that, 
but I do believe it needs to be justified.

>  * Cancellation is disabled during unwinding.
> 
> But there are still some open questions:

[snip]

>  * Should cancellation also be disabled in destructors run during normal
>    execution?  In catch blocks?
> 
> IMO, no and no.

This implies a difference in how destructors behave, depending on why 
they are invoked.  If such a difference can be avoided, I think it 
should be: we have Ted Baker's model (destructors always disable 
cancellation), and the other obvious choice is to leave it to the user 
to take the necessary precautions when writing destructors. Good C++ 
programmers already know how to do that.

- Wil




More information about the c++-pthreads mailing list