首页 > 解决方案 > 抛出'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();
}

标签: c++signals

解决方案


信号处理程序在线程 t 的上下文中调用。不能调用t.join()线程路由,否则会导致死锁,从而导致程序终止,这样就避免了死锁。


推荐阅读