Windows API中的不间断线程部分

时间:2015-09-27 14:19:10

标签: c++ multithreading winapi

我在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中找到任何有助于执行此操作的功能。 有人可以给我建议如何做到这一点(提升库有这个功能)。

2 个答案:

答案 0 :(得分:1)

在用户模式下无法阻止正在终止的线程。

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

使用信号(变量,事件)来发送线程信号,WaitForSingleObject找到线程实际消失的时间。

来自MSDN TerminateThreadTerminateThread是危险的,破坏内核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)
  }
}

答案 1 :(得分:0)

看起来像一个糟糕的设计。我会反过来做,让线程检查一些标志并终止。如果您仍然需要能够杀死不行为的“失控”线程,那么请执行“公平警告”系统,其中每个线程都有一个要查看的标志,如果已设置,则终止。然后监视这些线程,如果它们在X时间后没有自行终止,则执行终止。

确保使用std::atomic确保正确写入标记并跨线程读取。