3

我有一个 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()卡在里面。有没有办法中断并让它立即退出?doLaboriousTask2()StopEverything() doLaboriousTask2()

谢谢!

4

1 回答 1

2

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

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

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

你问:

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

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

于 2013-03-21T10:36:48.593 回答