【发布时间】:2014-11-08 20:54:36
【问题描述】:
在我的 Windows 服务应用程序中,我可能会在我的进程中的某些线程上调用TerminateThread API。 (请注意,当线程无法使用信号机制和线程同步技术以“正常方式”退出时,我这样做只是作为最后手段。)我在客户提交的事件日志中注意到的是,这种情况很少见TerminateThread 可能会抛出 STATUS_INVALID_THREAD 异常,只有在属于 threadpool 的线程上调用该 API 时才会发生这种情况。
因为我确定我的线程都不是从线程池启动的,所以我对TerminateThread 的调用尝试关闭的线程必须来自另一个进程。这可能只是由于我的线程句柄首先关闭然后再次传递给TerminateThread API 而操作系统将其重用于另一个进程中的其他线程的竞争条件。
所以我的问题是,由于我的服务以足够高的权限(如localService)运行,TerminateThread API 在这种情况下是否会无意中终止属于另一个进程的某个线程?如果是,我该如何防止这种情况(除了找到我现在正在做的比赛条件)?
【问题讨论】:
-
你在打开其他进程吗?
-
@usr:是的。它可能会打开其他进程。
-
如果线程无法正常退出,那很好。您的代码中出现了缺陷。跟踪它并修复它,不要使用 TerminateThread。
-
从另一个进程获得线程池线程句柄的唯一方法是调用 OpenThread。如果您不调用 OpenThread,那么这不是您的问题。如果这样做,您可以将每个此类句柄的副本放入表中。在调用 TerminateThread 之前,先搜索表看看你正在使用的句柄是否在那里;如果是,则说明您的句柄有误。
-
顺便说一句,您至少做了两个不安全的假设:首先,不能保证 STATUS_INVALID_THREAD 异常的唯一可能原因是您正在尝试终止线程池线程;其次,即使您的代码不使用线程池,您的进程中可能仍然存在线程池线程,由操作系统或第三方软件自动启动。
标签: c++ windows multithreading winapi