我有一个包含线程函数的DLL,其伪代码如下:
volatile BOOL stopped = FALSE;
void StopEverything()
{
/* Enter critical section */
stopped = TRUE;
/* Leave critical section */
}
void workerThreadFunc()
{
Initialize();
/* Checkpoint 1 */
if(stopped)
{
/* Do cleanup */
return;
}
doLaboriousTask1();
/* Checkpoint 2 */
if(stopped)
{
/* Do cleanup */
return;
}
doLaboriousTask2();
Uninitialize();
}
在使用此DLL的代码中,清理函数如下所示:
void cleanup()
{
StopEverything();
/* Wait for all threads to exit */
/* Do other cleanup */
}
我的问题有两个:
workerThreadFunc()
执行而不是在各个检查点执行此类检查?workerThreadFunc()
卡在doLaboriousTask2()
内。有没有办法中断 StopEverything()
并让它立即退出?谢谢!
答案 0 :(得分:2)
是否有更好的方法可以阻止我的workerThreadFunc()执行而不是在各个检查点执行此类检查?
可能不是。没有完全可靠的方法来预先停止非托管代码中的线程。任何声称要做的事都会导致TerminateThread
。文档列出了使用该功能的各种可怕后果。例如:
- 如果目标线程拥有临界区,则不会释放临界区。
- 如果目标线程正在从堆中分配内存,则不会释放堆锁。
- 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能是 不一致。
- 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响其他用户 DLL。
你问:
有没有办法打断doLaboriousTask2()并让它立即退出?
好吧,您可以致电TerminateThread
但是,由于文档中描述的所有原因,您几乎肯定不应该这样做。