Windows API中的不可中断线程部分
Uninterruptible thread section in Windows API
我在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
来确保跨线程正确地写入和读取该标志。
相关文章:
- 使用 shared_ptr 在中断时结束多线程循环
- 如何使用 SIGINT 在第二个线程中断 getchar
- 可中断线程类 C++11 - 遇到错误?
- 指向成员对象的指针 - 中断线程
- 处理中断时,如何回到主gui线程
- 在 Visual Studio 中的调试中断时设置默认线程,C++
- 返回可中断线程的函数
- 多线程应用程序中的零MQ处理中断
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- C++等待用户输入的中断线程
- 如何中断Asynch线程
- 捕获升压线程中断和退出线程的正确方法
- 中断已处于条件变量等待调用中的提升线程
- 中断正在执行MKL或其他第三方函数的线程
- 《C++并发在行动》中的可中断线程示例
- 使用 Boost::thread 实现可中断线程
- 可以优化中断线程安全
- Windows API中的不可中断线程部分
- 在一定时间后中断线程,在等待时不阻塞
- 为什么此代码被认为是可重复的,以及当操作系统中断线程时究竟会发生什么