C 中断在线程中执行的函数调用
我有一个DLL,其中包含一个线程函数,其伪代码如下所示: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
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()
并立即退出- 如果目标线程拥有关键部分,则不会释放该关键部分
- 如果目标线程正在从堆中分配内存,则不会释放堆锁
- 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为 前后矛盾
- 如果目标线程正在操作共享DLL的全局状态,则该DLL的状态可能会被破坏,从而影响该DLL的其他用户 动态链接库
嗯,您可以调用
TerminateThread
,但是,出于文档中描述的所有原因,您几乎肯定不应该这样做。是的,出于同样的原因,我不想使用TerminateThread
。事实上,我在C++中描述了一种方法,但是它看起来很吓人,因为它直接修改寄存器(或者可能只是我)。我认为它并没有比<代码>终端线程>代码好。所以真的没有办法吗?另外,你觉得我的检查点策略怎么样?你在问题中使用的策略很好。这是在本机代码中完成的方式。但是函数调用的数量和清理代码的数量正在增加,并且这个方法正在慢慢变得不可管理。我认为在C中可能有一种更简洁的方法来处理这个问题。哦,好吧。根据上下文,一种选择可能是将繁重的任务分成一个单独的过程,然后可以随意终止。@HarryJohnston,由于更昂贵的上下文切换,单独的进程不会显著增加开销吗?通常,进程上下文切换不会显著增加开销,特别是在具有多个CPU核的系统上。但你需要分析你的特定场景才能确定。@HarryJohnston,是的,没错。但我一直认为线程切换比进程切换快是的,但除非进程频繁地相互等待,否则两者都不重要。当子流程独立工作时,它通常会在被切换之前获得至少一个完整的时间片。在进程之间切换所需的时间只占时间片的一小部分。