我没有一个特定的例子可以分享,但问题仍然存在。
假设我有一个创建线程的主进程Main
,即AKA Thread
。
Thread
如下操作(仅作为示例):
如果“某个流程”为Main
且Thread
会导致该怎么办?
杀死过程可能因方法而异:
TerminateProcess
PostMessage
答案 0 :(得分:2)
调用TerminateProcess()
将终止目标进程(或失败,例如没有足够的权限)。从与初始线程不同的线程调用它的事实是无关紧要的。如果它杀死了从中调用的相同进程,则该进程被终止,没有特殊情况。
答案 1 :(得分:1)
安全=健壮,良好的做法,无BUG等。
它始终是“安全的”,因为它在您的最终是健壮的并且具有明确定义的行为(成功或失败),并且几乎没有错误的空间,但是在TerminateProcess
的情况下它仍然是非常不可取。
向主线程或其他进程的线程发送退出消息可能会立即生效,也可能不会立即生效。然而,这是一种优雅,干净的方式来要求流程退出。它可能会也可能不会尊重该请求,它可能会在保留所有用户数据并将所有内容保持在明确定义的状态(最终)时这样做。
调用TerminateProcess
,假设它没有失败,只会导致操作系统不再为该进程分配任何CPU时间(包括你自己的,如果那是你终止的那个),关闭所有句柄由进程持有,将私有内存页面标记为未使用,等等
当你自己的进程被终止时它会以同样的方式工作,并且因为你在调用TerminateProcess
时预期这一点,所以不会发生任何不好的事情,至少在调用线程结束时。
终止流程意味着流程不会写入任何数据,例如在C标准库或类似的缓冲区中(来自进程中的任何线程,任何“用户登陆”只是 poof )。
程序不有机会将其可能具有的任何半完整数据文件带入一致状态。您以这种方式杀死的另一个(您不知道)进程可能会在一组注册表更改中终止,现在这些更改将不一致。
此外,您没有严格保证要写入和仍然由Windows缓存的数据实际上会被写入(几乎这是通过它实现的方式保证,但您没有正式的保证,也是复制到系统缓冲区可能是部分的,程序不能再对故障情况做出反应。)