我有一个非常简单的程序:
#include <iostream>
#include <string>
#include <thread>
using namespace std;
struct N{
string s;
N(){}
~N(){cout<<"N dtor"<<endl;}
};
void f(){
N n;
throw 0;
}
int main(){
try{
thread a(f), b(f);
a.join();
b.join();
}catch(exception& e){
cout<<e.what()<<endl;
}
return 0;
}
在我的mac+clang环境下,运行结果是:
libc++abi.dylib: terminating with uncaught exception of type int
Abort trap: 6
它没有像我预期的那样打印“N dtor”。所以我的问题是,如果 std::thread 函数抛出异常,如何捕获/处理它?不能保证线程函数内的代码不会抛出任何异常。
我在 linux 上试了一下,异常可以被捕获并打印:
Enable multithreading to use std::thread: Operation not permitted
非常感谢。
如果在线程中抛出异常,则必须在同一个线程中捕获(或根本不捕获)。在您的示例中,该try
块可以专门从创建或加入线程的尝试中捕获异常,但不能捕获由线程中运行的代码引起的异常。
如果你考虑一下,这就是它必须的样子。您的示例试图确保try
在线程完成之前您不会离开块,但这通常不能保证。即使在您的示例中,如果join 调用试图抛出源自目标线程的异常(它们不会,但为了论证......),您将永远无法到达join(b)
调用,并且没有任何东西可以保证您“try
当b
的线程抛出异常时,仍然在块中。
一个线程捕获另一个异常的流控制根本不起作用。如果您需要这种功能,您可以在工作线程中放置一个异常处理程序,并使用已建立的线程间通信机制将异常状态传送回主线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句