这个问题的本质就是杀线程导致的线程间共享的数据出问题(数据状态不一致,所谓的inconsistent,不限于堆内存)
所以要根本解决这个问题,就是任何时候都不要用TerminateThread()杀线程,也不要把线程留给ExitProcess()的OS内部实现去杀。
而是要保证在进入ExitProcess()之前时,所有非主线程的那些线程都正常退出了。
MS的这个文档刻意提一下dll在进程退出时不要释放内存,就是为了避免内存(heap)被那些被强杀的线程给破坏了状态后再去操作这些内存,从而出现各种非预期的结果。
MS的Raymond Chen 2015年在他的Old New Thing系列blog里提过这个问题:
devblogs dot microsoft dot com /oldnewthing/20120105-00/?p=8683
【 在 snnn 的大作中提到: 】
: > 稍微好一点的处理,是退进程时,先把所有的线程都停掉(包括码农自己开的线程,和OS API内部开的线程),只剩下主线程。
: 我说的不是线程的问题。是DLL的退出顺序的问题。
--
FROM 114.254.115.*