c – 中断正在线程中执行的函数调用

我有一个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 */ } 

我的问题是双重的:

  1. 有没有更好的方法来阻止我的workerThreadFunc()执行,而不是在各个检查点进行检查?
  2. 假设workerThreadFunc()在主应用程序调用StopEverything()时被卡在StopEverything() 。 有没有办法打断 doLaboriousTask2()并立即退出?

谢谢!

Solutions Collecting From Web of "c – 中断正在线程中执行的函数调用"

有没有更好的方法来阻止我的workerThreadFunc()执行,而不是在各个检查点进行检查?

可能不会。 没有完全可靠的方式来抢先停止非托管代码中的线程。 任何声称要做的事情都会导致TerminateThread 。 文档列出了使用该功能的各种可怕后果。 例如:

  • 如果目标线程拥有临界区,临界区将不会被释放。
  • 如果目标线程正在从堆中分配内存,则堆锁不会被释放。
  • 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
  • 如果目标线程正在操作共享DLL的全局状态,则可能会破坏DLL的状态,从而影响DLL的其他用户。

你问:

有没有办法打断doLaboriousTask2()并立即退出?

那么,你可以调用TerminateThread但是,由于文档中描述的所有原因,你几乎肯定不应该那样做。