Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 中断在线程中执行的函数调用_C_Windows_Multithreading_Function_Interrupt - Fatal编程技术网

C 中断在线程中执行的函数调用

C 中断在线程中执行的函数调用,c,windows,multithreading,function,interrupt,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(s

我有一个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();
}
void cleanup()
{
    StopEverything();

    /* Wait for all threads to exit */
    /* Do other cleanup */
}
在使用此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();
}
void cleanup()
{
    StopEverything();

    /* Wait for all threads to exit */
    /* Do other cleanup */
}
我的问题有两个:

  • 有没有更好的方法来阻止我的
    workerThreadFunc()
    执行,而不是在各种检查点执行类似的检查
  • 假设当主应用程序调用
    StopEverything()
    时,
    workerThreadFunc()
    卡在
    doLaboriousTask2()
    内。有没有办法中断
    doLaboriousTask2()
    并立即退出
  • 谢谢

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

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

    • 如果目标线程拥有关键部分,则不会释放该关键部分
    • 如果目标线程正在从堆中分配内存,则不会释放堆锁
    • 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为 前后矛盾
    • 如果目标线程正在操作共享DLL的全局状态,则该DLL的状态可能会被破坏,从而影响该DLL的其他用户 动态链接库
    你问:

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


    嗯,您可以调用
    TerminateThread
    ,但是,出于文档中描述的所有原因,您几乎肯定不应该这样做。

    是的,出于同样的原因,我不想使用
    TerminateThread
    。事实上,我在C++中描述了一种方法,但是它看起来很吓人,因为它直接修改寄存器(或者可能只是我)。我认为它并没有比<代码>终端线程>代码好。所以真的没有办法吗?另外,你觉得我的检查点策略怎么样?你在问题中使用的策略很好。这是在本机代码中完成的方式。但是函数调用的数量和清理代码的数量正在增加,并且这个方法正在慢慢变得不可管理。我认为在C中可能有一种更简洁的方法来处理这个问题。哦,好吧。根据上下文,一种选择可能是将繁重的任务分成一个单独的过程,然后可以随意终止。@HarryJohnston,由于更昂贵的上下文切换,单独的进程不会显著增加开销吗?通常,进程上下文切换不会显著增加开销,特别是在具有多个CPU核的系统上。但你需要分析你的特定场景才能确定。@HarryJohnston,是的,没错。但我一直认为线程切换比进程切换快是的,但除非进程频繁地相互等待,否则两者都不重要。当子流程独立工作时,它通常会在被切换之前获得至少一个完整的时间片。在进程之间切换所需的时间只占时间片的一小部分。