|
Boost : |
From: Anthony Williams (anthwil_at_[hidden])
Date: 2002-08-12 04:31:55
From: William Kempf [mailto:williamkempf_at_[hidden]]
Sent: 11 August 2002 23:31
> >From: "Victor A. Wagner, Jr." <vawjr_at_[hidden]>
> >Date: Sun, 11 Aug 2002 11:59:15 -0700
> >
> >At Sunday 2002/08/11 06:48, you wrote:
> >>>From: "Victor A. Wagner, Jr." <vawjr_at_[hidden]>
> >>>At Thursday 2002/08/08 07:49, you wrote:
> >>>>----- Original Message -----
> >>>>From: "Victor A. Wagner, Jr." <vawjr_at_[hidden]>
> >>void my_thread(boost::thread* pthread)
> >>{
> >> try
> >> {
> >> pthread->join();
> >> }
> >> catch(...)
> >> {
> >> cout << "main() threw an exception" << endl;
> >> }
> >> delete pthread;
> >>}
> >>
> >>int main()
> >>{
> >> boost::thread* main = new thread();
> >> boost::thread thrd(boost::bind(&my_thread, main));
> >> thread_exit(); // Yes, this is something that needs added to
> >> // Boost.Threads, and will be.
> >> throw "error!";
> >>}
> >>
> >>The above can't be done portably, AFAIK, and is likely to result in
> >>termination instead of the expected passage in join().
> >
> >I have no idea what this is supposed to "do" so that it's
> not portable
> >seems irrelevant.
> >Although I have no idea what thread_exit() will actually do,
> having it
> >execute the next line of code seems counter-intuitive.
> >The following code works as I expected on VC++.NET (not that
> I'm attempting
> >to hold it out as either definitive nor conforming) and if
> the "if (argc >
> >2)" is removed or changed to, say, >1, the "unexpected
> exception" occurs,
> >otherwise this executes to completion without "problem".
>
> Shoot. My apologies. I wrote that way too fast. The throw
> should have
> occured before the call to thread_exit(). The point being
> that, as per
> behavior on every platform I'm familiar, thread_exit() (i.e.
> its platform
> equivalent) causes the thread to exit, and in the case of the
> main thread
> this means the process doesn't terminate until all other
> threads complete.
> The throw skips the call to thread_exit(), and thus the
> terminate() is
> called because of the uncaught exception. This means the main thread
> behaves differently from all other threads with regard to exception
> handling... unless you 1) can change the language rules or 2)
> make the
> exception handling consistent by having threads call
> terminate() in case
> there's an uncaught exception as well.
Alternatively, you could just set a terminate_handler which calls
thread_exit, and ensure that uncaught exceptions in all threads terminate
that thread, and only that thread. This is then consistent across all
threads. As I posted before, it works successfully on MSVC/win32threads
MSVC/pthreads, gcc-mingw/win32threads gcc-mingw/pthreads
gcc-sparc-solaris/pthreads.
If join is called on a thread that terminated through an exception, then you
could notify the caller of join that the thread terminated through an
uncaught exception, but that is another issue.
Anthony
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk