如果在获取互斥锁之后发生中断,会发生什么

what happens if Interrupts occur after mutex lock has been acquired

本文关键字:中断 什么 之后 获取 如果      更新时间:2023-10-16

我有一个多线程C/C++程序,它经常为读写请求提供服务。出于同步的目的,我使用了一个互斥锁来进行锁定和解锁。所有读写线程在执行操作之前都会获取锁。如果一个线程获得了锁,而在释放锁之前,中断发生了,会发生什么?线程会继续执行吗?还是我必须手动处理它?

用户端锁,包括互斥锁,不会阻塞中断。这一点很重要,因为Mutex通常可用于保护从磁盘上的文件读取,或保护从网络接收数据包,因此,其结果取决于中断。

从本质上讲,如果出现中断,"什么都不会发生"。中断由操作系统处理,就像其他任何时间一样。在这种情况下,你的程序不需要做任何事情,如果发生这种情况,只需要几微秒或几毫秒的时间来完成你为任务编程的任何事情。

一些内核侧锁(如SpinLocks)确实会阻止(该处理器内核上的)中断,以确保其他进程/线程在该进程期间不会被调度。在这种情况下,内核可以使用什么函数也有限制——例如,在此期间不可能调用阻塞函数(如睡眠、等待事件或文件读取或写入),因为这可能会导致内核锁定。

线程最终将恢复执行,这可能发生在内核为中断提供服务之后,或者内核调度程序可能决定调度另一个准备运行的线程。如果被中断的线程获取了一个竞争激烈的锁,那么试图获取该锁的其他线程将阻塞(或者旋转,或者旋转然后阻塞,具体取决于互斥体的实现),直到被中断线程再次被调度,完成由该锁保护的关键部分,并将其解锁

在需要接近实时性能的系统中,会进行仔细的调优,将关键线程分配给它们自己的核心(cpu相关性),并将中断映射到其他核心。此外,锁的使用也会引起注意,有时会使用无锁的算法。

线程具有锁这一事实不受信号的影响。如果线程有一个锁并接收到一个信号,则不会发生任何特殊情况。事实上,信号和线程不能很好地混合,因为信号是在考虑进程的情况下设计的。这是因为你不知道哪个线程会得到信号。正确的处理方法是让一个特定的线程来管理信号,例如阻止除一个线程外的每个线程中的所有信号,这只是处理信号。这是在有线程的软件中处理信号的正确方法。