【问题标题】:c++ terminate called after throwing an instance of 'std::system_error' what(): Resource deadlock avoided when join thread抛出'std :: system_error'what()的实例后调用c ++终止:加入线程时避免资源死锁
【发布时间】:2020-09-24 04:03:21
【问题描述】:

我正在为信号句柄编写一个简单的测试代码。我在子线程中生成一个 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


【解决方案1】:

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

【讨论】:

  • 是否有一些推荐的方法来处理信号以避免由 t.join 引起的死锁?
  • 您可以使用同步原语,立即离开信号处理程序并在主线程中调用t.join()。在您的特定示例中,您可以在暂停之前致电t.detach()
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多