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;
}

Victor A. Wagner Jr.      http://rudbek.com
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"