Boost logo

Boost :

From: Alexander Terekhov (terekhov_at_[hidden])
Date: 2002-08-24 16:57:43


"Victor A. Wagner, Jr." wrote:
>
> At Saturday 2002/08/24 10:46, you wrote:
> >I hope this rerun of The Meta Thread is better than the original...
> >
> >My interpretation of the latest comments by Bill (= Bill Kempf) was that
> >uncaught exceptions should cause a termination, but not of the process,
> >but instead of the thread, using some "terminate_thread". There would
> >still be no attempt to duplicate that exception for catching in other
> >threads (joiners or not). After that comment, the "tumult" ceased, and
> >the first iteration of the frensic thread was ended. That I regarded as
> >a silent consensus (which was probably totally wrong...).
>
> I think it ended when I offered to help, and Bill provided a set of
> "requirements" (damifino where he got them) to go into the code. I figured
> I wait until he'd finished all the changes we was going to put into the
> release before I started mucking with it. Unfortunately, the release has
> been pushed back (and i've been busy anyhow). ....

Do you mean:

<quote>

  "William E. Kempf" <williamkempf_at_[hidden]> wrote in message
  news:OE52qXkXriph10Jnoa90000a3bb_at_hotmail.com...
>
> This means terminate_thread()
> instead, which only terminates the current thread and not the application.
> A set_terminate_thread_handler() can be employed to handle this case in the
> same manner that you'd use for application termination.

</quote>

<?>

Well, it "can be done" (initial/main thread including, BTW):

http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/EDCLB120/5.1.55
(5.1.55 set_terminate() -- Register a Function for terminate())

"....
 Note that the function registered for terminate() must terminate
 execution of the program without returning to its caller(). If
 set_terminate() has not yet been called, then terminate() calls
 a system-defined default terminate handler, which calls abort().

 In a multithreaded environment, the terminate function created
 by the issuance of a set_terminate() call applies to all threads
 in the (POSIX) process. If a thread throws an exception which is
 not caught by that thread of execution, then terminate() is called.
 The default terminate() action calls abort() which by default cause
 a SIGABRT signal. If there is no signal handler, then SIGABRT
 terminates the process. You can override this with a thread-level
 termination by suppling a function which invokes pthread_exit()
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 as a terminate function. This terminates the thread but not the
 process.
 ...."

But it doesn't really make any sense, IMO. For example, consider:

ISO/IEC 14882:1998(E), Pg. 298 (note 134)

"For example, if the object being thrown is of a class with
 a copy constructor, terminate() will be called if that copy
 constructor exits with an exception during a throw."

Well, this stuff aside, consider that pthread_exit() is nothing
but a) store the argument in the thread object for POSIX joinable
thread and b) throw "thread_exit" exception to unwind the stack;
call POSIX/C thread cleanup handlers, etc.

But "stack unwinding" (to the extent that there can be >>NO<<
try scope at all; see the definition of "stack unwinding" term)
explicitly PROHIBITED in all but one terminate() cases:

ISO/IEC 14882:1998(E), Pg. 299

"In such cases,

     void terminate();

 is called (18.6.3). In the situation where no matching handler
 is found, it is implementation-defined whether or not the stack
 is unwound before terminate() is called. In all other situations,
 the stack shall not be unwound before terminate() is called."
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

regards,
alexander.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk