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

时间:2013-03-21 09:57:08

标签: c windows multithreading function interrupt

我有一个包含线程函数的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. 假设主应用程序调用{​​{1}}时workerThreadFunc()卡在doLaboriousTask2()内。有没有办法中断 StopEverything()并让它立即退出?
  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

  

是否有更好的方法可以阻止我的workerThreadFunc()执行而不是在各个检查点执行此类检查?

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

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

你问:

  

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

好吧,您可以致电TerminateThread但是,由于文档中描述的所有原因,您几乎肯定不应该这样做。