如果在获取互斥锁之后发生中断,会发生什么
what happens if Interrupts occur after mutex lock has been acquired
我有一个多线程C/C++程序,它经常为读写请求提供服务。出于同步的目的,我使用了一个互斥锁来进行锁定和解锁。所有读写线程在执行操作之前都会获取锁。如果一个线程获得了锁,而在释放锁之前,中断发生了,会发生什么?线程会继续执行吗?还是我必须手动处理它?
用户端锁,包括互斥锁,不会阻塞中断。这一点很重要,因为Mutex通常可用于保护从磁盘上的文件读取,或保护从网络接收数据包,因此,其结果取决于中断。
从本质上讲,如果出现中断,"什么都不会发生"。中断由操作系统处理,就像其他任何时间一样。在这种情况下,你的程序不需要做任何事情,如果发生这种情况,只需要几微秒或几毫秒的时间来完成你为任务编程的任何事情。
一些内核侧锁(如SpinLocks)确实会阻止(该处理器内核上的)中断,以确保其他进程/线程在该进程期间不会被调度。在这种情况下,内核可以使用什么函数也有限制——例如,在此期间不可能调用阻塞函数(如睡眠、等待事件或文件读取或写入),因为这可能会导致内核锁定。
线程最终将恢复执行,这可能发生在内核为中断提供服务之后,或者内核调度程序可能决定调度另一个准备运行的线程。如果被中断的线程获取了一个竞争激烈的锁,那么试图获取该锁的其他线程将阻塞(或者旋转,或者旋转然后阻塞,具体取决于互斥体的实现),直到被中断线程再次被调度,完成由该锁保护的关键部分,并将其解锁
在需要接近实时性能的系统中,会进行仔细的调优,将关键线程分配给它们自己的核心(cpu相关性),并将中断映射到其他核心。此外,锁的使用也会引起注意,有时会使用无锁的算法。
线程具有锁这一事实不受信号的影响。如果线程有一个锁并接收到一个信号,则不会发生任何特殊情况。事实上,信号和线程不能很好地混合,因为信号是在考虑进程的情况下设计的。这是因为你不知道哪个线程会得到信号。正确的处理方法是让一个特定的线程来管理信号,例如阻止除一个线程外的每个线程中的所有信号,这只是处理信号。这是在有线程的软件中处理信号的正确方法。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 如果在获取互斥锁之后发生中断,会发生什么
- 是什么变化导致C++中ABI中断
- 在中断例程中使用C++对象(和volatile)的正确方法是什么
- 为什么 itr = vector.erase(itr) 在循环中导致内存库中断?我在这里做错了什么吗?
- 如果ISR运行时发生中断会发生什么
- 在共享库的构造函数(_init部分)中,如何知道什么函数被中断了?
- 查找硬件中正在使用的中断驱动程序的命令是什么?
- 为什么此代码被认为是可重复的,以及当操作系统中断线程时究竟会发生什么
- 当我不输出变量时,代码中断;我什么时候工作。