main()线程发生异常后的.join()

时间:2014-04-07 20:40:56

标签: c++ multithreading c++11

学习C ++线程支持库。使用Visual Studio Professional 2013,并使用MS编译器和英特尔最新的C ++编译器测试代码。

编写小测试程序以测试异常处理。想法是模拟主线程中发生的异常,捕获异常并将另一个线程连接到主线程。

std::thread t(foo); //foo is just a function that prints a message

try
{
    //std::this_thread::sleep_for(std::chrono::seconds(1));
    throw  std::exception();
}
catch (const std::exception& e)
{
    std::cout << ".join after exception !\n";
    t.join();
}
std::cout << ".join in main() !\n";
//t.join()

但是,在运行时,它会抛出错误:

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!

Program: ...al studio 2013\Projects\CPP_nonexcept\Debug\CPP_nonexcept.exe

R6010

- abort() has been called

为什么?

编辑:正如评论中指出的,我的代码不正确,我已相应更改了代码。但是,我一直得到与以前完全相同的错误。

1 个答案:

答案 0 :(得分:4)

您正在抛出指向异常的指针并按值捕获异常。这些类型不匹配,因此不会捕获异常。抛出异常对象(并通过引用捕获):

try
{
  throw  std::exception();
}
  catch (const std::exception& e)
{
  ....

现在您将捕获异常,加入catch块中的线程。这意味着您无法再次加入该线程,它不再是 joinable 。请参阅std::thread::join