在抛出 'std::system_error' what() 的实例后调用 c++ 终止:加入线程时避免了资源死锁
c++ terminate called after throwing an instance of 'std::system_error' what(): Resource deadlock avoided when join thread
我正在为信号句柄编写一个简单的测试代码。我在子线程中生成一个 SIGSEGV,并处理该信号。
但是错误 std::system_error' what(): Resource deadlock avoided
让我很困惑。为什么会出现资源死锁?
struct TestSignal{
static TestSignal& GetInstance(){
static TestSignal t;
return t;
}
void Start(){
t = std::thread([this](){
// cause a SIGSEGV
std::cout << *(int *) 0;
});
}
void Stop(){
if (t.joinable()){
std::cout << "true" << std::endl;
}
t.join();
}
std::thread t;
};
void HandleSignal(int signum){
std::cout << "exit" << std::endl;
TestSignal::GetInstance().Stop();
exit(signum);
}
int main() {
TestSignal::GetInstance().Start();
signal(SIGINT, HandleSignal);
signal(SIGSEGV, HandleSignal);
pause();
}
在线程 t 的上下文中调用信号处理程序。你不能在线程路由中调用t.join()
,它会导致死锁,从而让程序终止,这样就避免了死锁。
我正在为信号句柄编写一个简单的测试代码。我在子线程中生成一个 SIGSEGV,并处理该信号。
但是错误 std::system_error' what(): Resource deadlock avoided
让我很困惑。为什么会出现资源死锁?
struct TestSignal{
static TestSignal& GetInstance(){
static TestSignal t;
return t;
}
void Start(){
t = std::thread([this](){
// cause a SIGSEGV
std::cout << *(int *) 0;
});
}
void Stop(){
if (t.joinable()){
std::cout << "true" << std::endl;
}
t.join();
}
std::thread t;
};
void HandleSignal(int signum){
std::cout << "exit" << std::endl;
TestSignal::GetInstance().Stop();
exit(signum);
}
int main() {
TestSignal::GetInstance().Start();
signal(SIGINT, HandleSignal);
signal(SIGSEGV, HandleSignal);
pause();
}
在线程 t 的上下文中调用信号处理程序。你不能在线程路由中调用t.join()
,它会导致死锁,从而让程序终止,这样就避免了死锁。