Windows API中的不可中断线程部分

Uninterruptible thread section in Windows API

本文关键字:中断 线程部 API Windows      更新时间:2023-10-16

我在Windows环境下编写多线程应用程序。工作循环由TerminateThread终止。我想知道我如何实现代码不能被中断,以避免数据丢失/内存问题:例如(伪代码)

while(true)
{
#NONINTERRUPTIBLE REGION
do something
#END OF NONINTERRUPTIBLE REGION
#THREAD WILL BE INTERRUPTED THERE (even if call was made earlier)
}

我在Windows API中找不到任何可以帮助做到这一点的函数。有人能给我建议如何做到这一点(boost库有这个功能)。

在User模式下不可能阻止正在被终止的线程。

这意味着任何对象,如CriticalSection和类内部都可以保持未定义状态。

使用信号(变量,事件)来通知线程,并使用WaitForSingleObject来查找线程何时实际离开。

来自MSDN TerminateThread,TerminateThread是危险的,破坏内核32状态,dll状态和临界区。

显然,代码中的指针也可能被破坏。

函数TerminateThread是最后的手段-可能是为了避免一些更糟糕的行为而在程序前终止。

更新1

volatile int threadOK; // set to false when thread should complete
Threadfunction() 
{
  while( threadOK )
  {
   #NONINTERRUPTIBLE REGION
   do something
   #END OF NONINTERRUPTIBLE REGION
   #THREAD WILL BE INTERRUPTED THERE (even if call was made earlier)
  }
}

似乎是一个糟糕的设计。我会做另一种方式,让线程检查一些标志并终止。如果您仍然需要能够杀死不正常的"失控"线程,那么可以使用"公平警告"系统,其中每个线程都有一个要查看的标志,如果设置了,则终止。然后监视这样的线程,如果它们在一定时间内没有自行终止,则执行终止操作。

确保使用std::atomic来确保跨线程正确地写入和读取该标志。