[c++-pthreads] Restating the Jason model
Wil Evers
wil at bogo.xs4all.nl
Fri Jan 16 15:14:18 UTC 2004
Jason Merrill wrote:
> On Tue, 13 Jan 2004 21:19:15 +0100, Wil Evers <wil at bogo.xs4all.nl> wrote:
>
>>It is true that an exception escaping from a destructor will not trigger
>>immediate program termination when the program/thread in question is not
>>unwinding; however, that doesn't mean there's nothing to worry about. The
>>most likely symptom is a resource leak; in a multi-threaded environment,
>>that could mean a deadlock.
>
> True, throwing out of a destructor is more likely to cause trouble than
> throwing from other places; a destructor like
>
> Guard::~Guard()
> {
> write (0, "releasing", sizeof ("releasing");
> release (resource);
> }
>
> will fail to actually release the resource if a cancel is delivered during
> the call to write(). It's certainly possible to restructure code to avoid
> this problem, but I can see this being a source of hard-to-debug problems.
The situation is actually a bit more complicated: many container
implementations, including the ones in the C++ standard library, assume
that the destructors of their elements do not throw. Most likely, an
exception escaping from one element's destructor will cause the
remaining elements to be abandoned (and not destroyed at all).
> This is a somewhat persuasive case for disabling cancel during all
> destructors, but I'm not sure it outweighs the overhead involved. In the
> model I proposed, only the EH runtime needs to know about cancellation.
As I tried to say before, my main objection to your model is that,
depending on the thread's dynamic context, destructors will behave
differently when hitting a cancellation point. Sometimes, your model
will protect us from cancellation exceptions, but at other times it
won't, and I fear the confusion that might result from this.
I agree that the overhead of disabling cancellation in all destructors
could become a problem. IMO, if we have sticky cancellation, the EH
runtime doesn't need to be disable cancellation either.
Most destructors only deal with releasing memory anyway, and don't need
to call any throwing functions. Some destructors do more complicated
things, involving calls to functions that *do* throw exceptions. These
destructors must take extra precautions and are harder to implement, but
this has always been the case - ever since exceptions were added to C++.
The thing that changes because of cancellation is that some functions
that didn't throw before will now be licensed to do so. It seems to me
that most of the participants on this mailing list accept that this will
require changes to existing code. That could include adding a try/catch
block to destructor code.
- Wil
More information about the c++-pthreads
mailing list