- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
假设一个程序有多个线程:t1、t2 等。这些线程都在使用 pthread。 t2 线程位于从流中读取并访问具有静态存储持续时间的变量的循环中。
现在假设 t1 调用 exit(0)
。
(更多细节:我有一个程序在基于 Unix 的系统上执行此操作,并使用 g++ 编译。该程序似乎偶尔会在关闭时崩溃,堆栈跟踪表明静态变量无效.)
线程是否在 C++ 对象销毁之前被终止?
C++ 是否不知道线程,所以这些线程会一直运行直到 C++ 清理完成?
SIGTERM
处理程序应该在继续之前先关闭或终止线程,还是自动发生?
最佳答案
我正在回答您问题标题中的问题,而不是 3 个要点,因为我认为要点问题的答案与回答实际问题无关。
当程序处于随机状态时使用 exit
- 正如您似乎建议的那样 - 通常是一种相当残酷且不确定的方式来结束程序,即使是单线程也是如此。线程在对象销毁之前或之后被销毁甚至都没有关系,这两种方式都会导致噩梦。请记住,每个线程都可能处于随机状态并访问任何内容。并且每个线程的栈对象都不会被正常销毁。
参见 exit
的文档看看它做什么和不清理。
我见过的正确关闭多线程程序的首选方法是确保没有线程处于随机状态。以某种方式停止所有线程,在可行的情况下对它们调用 join
,然后从最后剩余的线程调用 exit
- 或 return
如果这发生在 main 函数中。
我经常看到的一种错误方法是正确处理一些对象,关闭一些句柄,然后通常尝试正确关闭,直到一切都出错,然后调用 terminate
。我建议不要这样做。
关于c++ - 如果在其他线程仍在运行时调用 exit(0) 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806337/
我是一名优秀的程序员,十分优秀!