我有一个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()
在主应用程序调用StopEverything()
时被卡在StopEverything()
。 有没有办法打断 doLaboriousTask2()
并立即退出? 谢谢!
有没有更好的方法来阻止我的workerThreadFunc()执行,而不是在各个检查点进行检查?
可能不会。 没有完全可靠的方式来抢先停止非托管代码中的线程。 任何声称要做的事情都会导致TerminateThread
。 文档列出了使用该功能的各种可怕后果。 例如:
- 如果目标线程拥有临界区,临界区将不会被释放。
- 如果目标线程正在从堆中分配内存,则堆锁不会被释放。
- 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
- 如果目标线程正在操作共享DLL的全局状态,则可能会破坏DLL的状态,从而影响DLL的其他用户。
你问:
有没有办法打断doLaboriousTask2()并立即退出?
那么,你可以调用TerminateThread
但是,由于文档中描述的所有原因,你几乎肯定不应该那样做。