c++ - 如何安全终止多线程进程

标签 c++ c linux multithreading unix

我正在开发一个项目,我们使用 pthread_create 创建了多个子线程。 线程创建逻辑不受我控制,因为它由项目的其他部分实现。

每个线程执行一些需要超过 30 秒才能完成的操作。 在正常情况下,该程序运行良好。 但是问题出现在程序终止的时候。 当我收到 SIGINT 信号时,我需要尽快退出 main。

当我调用 exit() 或从 main 返回时,将调用退出处理程序和全局对象的析构函数。而且我相信这些操作与正在运行的线程存在竞争条件。而且我相信有很多竞争条件,这很难解决所有这些问题。 在我看来,有两种解决方案。

  1. 调用 _exit() 并忘记所有资源的取消分配
  2. 当 SIGINT 存在时,关闭/杀死所有线程,然后从主线程调用 exit(),这将释放资源。

我认为第一个选项可行,但我不想突然终止该过程。 所以我想知道是否有可能尽快终止所有子线程,以便退出处理程序和析构函数可以执行所需的清理任务并终止程序。

这篇文章我已经看完了,如果你知道其他方法,请告诉我:POSIX API call to list all the pthreads running in a process

另外,请告诉我是否有任何其他解决方案可以解决此问题

最佳答案

程序退出前需要做什么?如果答案是“取消分配资源”,那么您无需担心。如果您调用 _exit,程序将立即退出,操作系统将为您清理一切。

另请注意,您可以在信号处理程序中安全地执行的操作非常有限,因此不建议您尝试自行执行任何清理工作。如果您有兴趣,这里有一份您可以 做什么的列表 here .但是,例如,您不能将文件刷新到磁盘(这是我能想到的您可能合法想在这里做的唯一事情)。这是禁区。

关于c++ - 如何安全终止多线程进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71352014/

相关文章:

c++ - 图中最大独立集的递归程序

c++ - 如何在主要方法之外将字符串拆分为标记

c - 唤醒一个正在休眠的线程,否则休眠N秒

linux - 如何基于键和字符串匹配+awk比较两个文件

php - fsockopen() 返回空指针,$errstr 为空(无错误信息)

c++ - 在 wireshark 中查看来自 TFTP 客户端的未知操作码

c++ - Win32 API 事件 - 在不同进程的访问方面有哪些限制?

C 编程组织 char 值矩阵

c - 位掩码和选择偶数位

c++ - zlib 压缩/解压缩 C++ Linux