我们为啥要禁用关键部分的中断
Posted
技术标签:
【中文标题】我们为啥要禁用关键部分的中断【英文标题】:why should we disable interrupts for critical sections我们为什么要禁用关键部分的中断 【发布时间】:2015-01-16 13:26:55 【问题描述】:我是同步的初学者,我在临界区有一些问题,我知道锁定临界区可以确保同步。
// Some Code
Acquire_lock()disable Interrupts;
Critical section //Interrupt occurs and arrives to acquire the same lock.
Release_lock()enable Interrupts;
我的问题是:为什么在获取关键部分的锁时禁用中断?
【问题讨论】:
【参考方案1】:注意以下适用于 Unix/Linux,不确定它是否也适用于 Windows。
如果您获得了锁,则该锁为当前进程“拥有”。 IE。如果其他进程尝试使用相同的锁,则会被阻止。
由于锁由整个进程拥有,它们不足以有效地阻止进程内部同时访问。 (这适用于并发线程和中断处理程序)。
例如,假设一个进程获得了一个锁,然后发生了中断。这会导致调用该信号的中断处理程序,可能在您的关键部分的中间。现在假设中断处理程序尝试获取相同的锁(因为它也想调用相同的临界区)。这将起作用(因为进程已经拥有锁)。
换句话说,中断处理程序不会被主线程占用的锁停止。因此,要使主线程的锁生效,中断处理程序也必须暂时停止。
请注意,对于 Unix/Linux 中的多线程应用程序,有一组不同的系统调用需要同步,因此对于单线程应用程序中的中断处理程序而言,上述问题比并发线程更严重。
注意:顺序应该是
-
禁用中断
锁定
执行关键代码
解锁
启用中断
【讨论】:
首先不应该在中断中使用锁吗?如果是这样,是否还需要禁用中断?! 一般来说,如果你不在中断代码中使用锁,并且你不会干扰你的关键代码的状态,那么我会说你不需要禁用它们.以上是关于我们为啥要禁用关键部分的中断的主要内容,如果未能解决你的问题,请参考以下文章