学习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
为什么?
编辑:正如评论中指出的,我的代码不正确,我已相应更改了代码。但是,我一直得到与以前完全相同的错误。
答案 0 :(得分:4)
您正在抛出指向异常的指针并按值捕获异常。这些类型不匹配,因此不会捕获异常。抛出异常对象(并通过引用捕获):
try
{
throw std::exception();
}
catch (const std::exception& e)
{
....
现在您将捕获异常,加入catch
块中的线程。这意味着您无法再次加入该线程,它不再是 joinable 。请参阅std::thread::join
。