![]() |
1
2
在正常程序终止期间,静态初始化或延迟初始化的所有内容(例如,输入了包含块的块作用域静态变量)都会被取消初始化-或者
问题不在于线程终止的顺序,而是 根本没办法阻止他们 . 相反,当进程终止时,将获取(可能仍在运行)线程委托给操作系统进行排序。 实际上,对于一个实现来说,强制终止线程是非常困难的——分离或其他方式。除了其他事情之外,这是一个不可预知行为的秘诀,因为这些线程几乎总是被同步对象或系统调用阻塞,并保留资源(hello deadlocks!)另一方面,POSIX线程不提供这样做的API。线程需要从其线程函数返回以退出并不奇怪。
两者之间有有限的时间间隔
如果这些线程中的任何一个恰好访问静态初始化的对象,那么这当然是 未定义行为 . 我最近花了相当多的时间在一个大型的iOS应用程序中跟踪了一系列崩溃,其中包含了大量的C++。
崩溃的代码看起来很像这样,崩溃在
与此同时,在主线程上,有一个调用
iOS和MacOS应用程序大量使用Grand Central Dispatch/libDispatch进行多线程处理,结果不仅是在
我怀疑在许多其他系统上也会出现类似的情况。 除了避免使用块范围静态数据来处理不需要初始化的数据之外,我没有找到一个非常好的解决方案。 |
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 9 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 9 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 9 月前 |
![]() |
András Takács · Python多线程问题 1 年前 |
|
András Takács · Python多线程错误 1 年前 |