c++ - 抛出'std :: system_error'what()的实例后调用c ++终止:加入线程时避免资源死锁
问题描述
我正在为信号句柄编写一个简单的测试代码。我在子线程中生成一个 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()
线程路由,否则会导致死锁,从而导致程序终止,这样就避免了死锁。
推荐阅读
- php - 将搜索重定向到主页
- java - java:如果正确,我该如何使用
- version-control - Shopify 团队的版本控制?
- java - Logback、Eclipse 和 Maven
- powershell - 脚本中的问题:调用命令“错误:通信出错”
- unity3d - 动态生成圆柱段形状的对象
- java - 获取在 servlet 容器中运行的 jar 资源中打包/包含的文件的信息
- html - 具有相同页面的 Amp 页面实现
- angular - 角度 cli 版本映射到角度版本?
- .htaccess - htaccess 将通配符子域的规则重写为 codeigniter 中的参数