"Let me see if I understand your fist sentence (since it doesn't appear to
be
illustrated by the following code). If the user's thread throws one
of the
"allowed" exceptions and some code then calls, say,
boost::thread::join()
then join will throw the exception originally thrown in
the thread? That
doesn't sound usable, let alone implementable."
See my attached implementation (that had to
provide some hacking/"configuring" to get it to work with my version
CodeWarrior).
There is no reason for the entire application
should exit upon an exception in a thread--that is the most un-robust soltion
possible.
The only argument I can see against supporting the
thread exceptions is that the entire boost community (and I) are against
exception specifications, but as far as I can tell, it is the only way to
implement them (while abstracting the implementer of the thread function from
the details thread_throw, which otherwise makes the threaded function
non-generic/thread specific).
(Please ignore the boost::New<> template
that I've used, that is something I will like to suggest, to work solely within
the shared_ptr paradigm, without having to constantly construct them based on
instance pointers returned by ::new--in my opinion, this goes beyond syntax
sugar. I also develop at 1400x1050 resolution, so for those that are less
fortunate, a lot of scrolling might be involved.)
----- Original Message -----
Newsgroups:
gmane.comp.lib.boost.devel
Sent: Monday, 2002:August:05 12:59
PM
Subject: Re: Threads &
Exceptions
----- Original Message -----
From: "Eric Woodruff" <Eric.Woodruff@falsetto.com>
To:
"boost" <boost@lists.boost.org>
Sent:
Sunday, August 04, 2002 8:56 PM
Subject: [boost] Threads &
Exceptions
> I've developed a way to support user exceptions in
threads that I would
like
> to contribute to boost. In my opinion, it
can replace/extend (in the
literal
> sense) the existing thread class
(I also think the existing manor to
provide
> platform neutrality
with ifndefs is unacceptable, but that is for a new
> message thread.).
At the moment I have created a boost::advanced_thread
with
> usage as
simple as:
Exception handling isn't so cut and dried. You did get
me to look at the
code and realize there's a bug in the implementation that
I'll have to fix,
since currently we're eating all exceptions, but what
should occur is as
follows:
If the thread function object throws an
exception then std::terminate()
shall be called. This is compatible
with the required semantics of the
"initial thread" in the standard
(playing loose with terms here, since the
standard doesn't define any
threads, much less the initial one, but the
terminology should be
understandable and is the only translation possible in
a MT update to the
standard with out causing backwards compatibility
problems). If the
user requires different semantics he must employ the same
techniques as he
would in a single threaded application... i.e. employ
set_terminate() or
wrap the code in try/catch blocks. This means your
"advanced_thread"
would be a legal extension, but it's not the appropriate
behavior out of
the box.
The other addition you've made, allowing query of a "result
value", is
something that's still under consideration. It's syntactic
sugar since you
can achieve the same results trivially through the function
object you pass
to thread creation, but sometimes syntactic sugar is worth
it. The problem
here, however, is that it requires restrictions on
the type (it will have to
at least be copy constructable, and likely
default constructable and
assignable as well).
>
boost::advanced_thread<ReturnType, OrderedTupleOfExceptions (default
=
> none)>
>
> Upon access to any (most -- debatable) of
the public methods of the
> advanced_thread, a user exception may be
thrown. Exceptions not listed to
> the class will cause
std::bad_exception to be thrown (I believe that is
> appropriate). Of
course, advanced_thread<void> does not provide
> getReturnValue ()
{or return_value () to follow STL naming}.
Let me see if I understand
your fist sentence (since it doesn't appear to be
illustrated by the
following code). If the user's thread throws one of the
"allowed"
exceptions and some code then calls, say, boost::thread::join()
then join
will throw the exception originally thrown in the thread?
That
doesn't sound usable, let alone implementable.
> For
instance:
>
> #include <boost/advanced_thread.hpp>
>
#include <boost/bind.hpp>
>
> int testFunction ()
{
> throw 16;
>
return 11;
> }
>
> int main ()
{
>
> typedef
boost::advanced_thread<int,
thread_exceptions<int,
std::string>
> >
Thread;
>
> try
{
> Thread testThead
(boost::bind
(testFunction));
> int
const returnValue = testThread.getReturnValue (); // implicit
>
join
> }
> catch
(int number) {
>
std::cout << number << " was thrown!" <<
std::endl;
> }
>
catch (std::bad_exception& exception)
{
> std::cout <<
"An invalid exception was thrown by the thread user
> function. "
<< std::endl;
> }
> }
The
only real question with the above is what you'd do with the fact that
the
thread threw an exception?
Bill
Kempf
_______________________________________________
Unsubscribe &
other changes: http://lists.boost.org/mailman/listinfo.cgi/boost