[c++-pthreads] Re: thread-safety definition

Dave Butenhof David.Butenhof at hp.com
Tue Jan 20 12:37:24 UTC 2004


David Abrahams wrote:

>Gabriel Dos Reis <gdr at integrable-solutions.net> writes:
>  
>
>>David Abrahams <dave at boost-consulting.com> writes:
>>
>>| Dave Butenhof <David.Butenhof at hp.com> writes:
>>| 
>>| >>The problems with catch(...) eating all exceptions are maybe not as
>>| >>bad as you think.  As a matter of fact, there are vanishingly few
>>| >>exceptions that demand special recovery actions that wouldn't work for
>>| >>all other exceptions.  Systems designed that way tend towards
>>| >>fragility.
>>| >>
>>| > I see an immense difference between a pragmatic statement that "in
>>| > practice there seem to be few exceptions" and something on which
>>| > cross-platform, mixed-language, modular environment programmers can
>>| > depend as a law. C++ does not say that "all exceptions can be
>>| > finalized and recovered fully by performing these steps". To presume
>>| > they can is fragile.
>>| 
>>| It also doesn't say "no destructors will throw exceptions", but we
>>| generally rely on them not to, because it makes programs hard to
>>| write.  There are a whole host of things we leave up to good
>>| programming practice, most of which don't have to do with EH.
>>
>>Agreed, but we can't specify things like that.  If we assume some
>>working hypothesis to hold, then we have to make that assumption clear
>>in the specification.  I think that is the point Dave Butenhof was
>>making. 
>>    
>>
>I didn't think so, at all. I hope Dave will clarify on his own,
>though, especially if I'm wrong.
>  
>
Um, well, in a way I guess that is what I'm saying, though I was coming 
from a different angle and going someplace difference. I was really just 
casually commenting that, in general, a policy of grabbing all passing 
exceptions and smashing them indiscriminately into the ground didn't 
seem like a particular healthy strategy.

If the standard doesn't say that "all exceptions can be silently 
finalized without any special action", then I think any program that 
tries to do this with arbitrary exceptions is asking for trouble. It's 
not reliable, it's not portable, it's arguably not "correct".

You offer the counter-argument that the same can also be said for code 
that raises an exception that requires special action -- except, one 
must allow, where it can also be sure that it will control finalization.

But the standard, apparently, neither supports nor refutes either view. 
Which is very likely as it should be, since the standard applies to all 
sorts of special circumstances where trying to describe this sort of 
business just gets confusing and doesn't really help anyway.

>AFAICT the discussion is about whether it makes sense to support
>programs which do catch(...) without rethrowing, and if so, how.
>Right now we're discussing a morality issue: "is it inherently evil to
>catch(...)  without rethrowing?"
>
>My point is that one could just as well (and perhaps more justifiably)
>claim that it's evil to throw any exception that can't be dealt with
>via a catch(...) block that doesn't rethrow, where that block was
>designed to handle, say, bad_alloc.**
>  
>
The real issue isn't so much catching without a re-throw, but catching 
and dropping arbitrary exceptions. If you don't claim to know how to 
finalize a bad_alloc error, what business do you have catching it? (And 
since catch(...) is anonymous, even if you could handle it you can't 
identify it.) I'm not convinced there's any rational excuse for 
finalizing bad_alloc unless you know how to free up some memory to 
"cure" the problem that caused it. (Nor would there be any particular 
benefit.) If you can't deal with it, you need to let it propagate to 
someone who can; or to terminate the process.

In the case of cancel, it's possible (though not "inarguably correct") 
to define the exception's destructor to re-cancel. There's no good 
analogy for bad_alloc, though; you can't just free arbitrary objects and 
presume the application can continue. But, sure, this could be argued 
back and forth forever, and it's not strictly relevant to the "charter" 
of this group...

>(**) this isn't really about the exception objects, but about the
>conditions of program state they represent.
>  
>
Certainly true, at least to the extent that if the exception doesn't 
represent a "program state", it may not matter; and if it does, then at 
least in many cases the situation will be self correcting. (That is, 
when you drop bad_alloc on the floor, either the situation has been 
corrected -- whether deliberately or simply by unwinding some set of 
frames with local objects -- or else it'll reassert itself soon enough.)

There seems to be some disagreement over where cancel fits in this 
spectrum. It is a sort of program state (actually, thread state), and 
can't simply be thrown away (in normal applications) without breaking 
program semantics. On the other hand, it's a "one shot" that won't be 
automagically reasserted. Jason's model resolves this by making it 
artificially self-reasserting, via the exception object's destructor. 
Alexander argues against this. I think I'd be happy with an automatic 
re-cancel on a catch(...), but ideally I'd also like someone to be able 
to catch(cancel) without needing to do something extra (even a 
'cancel.finalize()') to prevent re-cancellation. Given widespread use of 
catch(...), though, I'm willing to accept that "re-cancel on destruct" 
might be the least objectionable compromise.

-- 
/--------------------[ David.Butenhof at hp.com ]--------------------\
| Hewlett-Packard Company       Tru64 UNIX & VMS Thread Architect |
|     My book: http://www.awl.com/cseng/titles/0-201-63392-2/     |
\----[ http://homepage.mac.com/dbutenhof/Threads/Threads.html ]---/




More information about the c++-pthreads mailing list