我正在开发一个项目,我们使用 pthread_create 创建了多个子线程。 线程创建逻辑不受我控制,因为它由项目的其他部分实现。
每个线程执行一些需要超过 30 秒才能完成的操作。 在正常情况下,该程序运行良好。 但是问题出现在程序终止的时候。 当我收到 SIGINT 信号时,我需要尽快退出 main。
当我调用 exit() 或从 main 返回时,将调用退出处理程序和全局对象的析构函数。而且我相信这些操作与正在运行的线程存在竞争条件。而且我相信有很多竞争条件,这很难解决所有这些问题。 在我看来,有两种解决方案。
- 调用 _exit() 并忘记所有资源的取消分配
- 当 SIGINT 存在时,关闭/杀死所有线程,然后从主线程调用 exit(),这将释放资源。
我认为第一个选项可行,但我不想突然终止该过程。 所以我想知道是否有可能尽快终止所有子线程,以便退出处理程序和析构函数可以执行所需的清理任务并终止程序。
这篇文章我已经看完了,如果你知道其他方法,请告诉我:POSIX API call to list all the pthreads running in a process
另外,请告诉我是否有任何其他解决方案可以解决此问题
最佳答案
程序退出前需要做什么?如果答案是“取消分配资源”,那么您无需担心。如果您调用 _exit
,程序将立即退出,操作系统将为您清理一切。
另请注意,您可以在信号处理程序中安全地执行的操作非常有限,因此不建议您尝试自行执行任何清理工作。如果您有兴趣,这里有一份您可以 做什么的列表 here .但是,例如,您不能将文件刷新到磁盘(这是我能想到的您可能合法想在这里做的唯一事情)。这是禁区。
关于c++ - 如何安全终止多线程进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71352014/