我在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中找到任何有助于执行此操作的功能。 有人可以给我建议如何做到这一点(提升库有这个功能)。
答案 0 :(得分:1)
在用户模式下无法阻止正在终止的线程。
这意味着任何对象(如CriticalSection
和类内部)都可以保留未定义状态。
使用信号(变量,事件)来发送线程信号,WaitForSingleObject
找到线程实际消失的时间。
来自MSDN TerminateThread,
TerminateThread
是危险的,破坏内核32状态,dll状态和关键部分。
显然,代码中的指针也可能被破坏。
函数TerminateThread
是最后的手段 - 可能是程序前终止,试图避免一些更糟糕的行为。
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
确保正确写入标记并跨线程读取。