At Sunday 2002/08/11 06:48, you wrote:
From: "Victor
A. Wagner, Jr." <vawjr@rudbek.com>
At Thursday 2002/08/08 07:49, you wrote:
----- Original Message -----
From: "Victor A. Wagner, Jr." <vawjr@rudbek.com>
> The C++ standard is silent on the topic of thread(s)
But not on the behavior of a program that has an exception thrown that
would
propogate out of main().
I fail to see how an exception which is "started" by
thread<whatever> can be considered "inside" of
main. And if it IS, then clearly I should be able to write:
catch(...)
{
}
to process it
Being "started by thread<whatever>" has nothing to do
with it.
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".
#include
"stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <boost/lexical_cast.hpp>
using namespace std;
int main(int argc, char* argv[])
{
cout << setw(2*argc) << ' ' << "entering main: " << argc << endl;
if (++argc < 10)
{
cout << setw(2*argc) << ' ' << "calling main: " << argc << endl;
try
{
main(argc, 0);
}
catch (exception& e)
{
cout << setw(2*argc) << ' ' << "exception: " << argc << " " << e.what() << endl;
}
cout << setw(2*argc) << ' ' << "returned from main: " << argc << endl;
}
if (argc > 2)
{
throw exception(("throwing: " + boost::lexical_cast<string>(argc)).c_str());
}
cout << setw(2*argc) << ' ' << "returning: " << argc << endl;
}
PGP RSA fingerprint = 4D20 EBF6 0101 B069 3817 8DBF C846 E47A
PGP D-H fingerprint = 98BC 65E3 1A19 43EC 3908 65B9 F755 E6F4 63BB 9D93
The five most dangerous words in the English language:
"There oughta be a law"