我们为啥要禁用关键部分的中断

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 中的多线程应用程序,有一组不同的系统调用需要同步,因此对于单线程应用程序中的中断处理程序而言,上述问题比并发线程更严重。

注意:顺序应该是

    禁用中断 锁定 执行关键代码 解锁 启用中断

【讨论】:

首先不应该在中断中使用锁吗?如果是这样,是否还需要禁用中断?! 一般来说,如果你不在中断代码中使用锁,并且你不会干扰你的关键代码的状态,那么我会说你不需要禁用它们.

以上是关于我们为啥要禁用关键部分的中断的主要内容,如果未能解决你的问题,请参考以下文章

为啥总是网络连接中断?

为啥 boost::mutex 使用原子操作和事件而不是关键部分

C#“lock”关键字:为啥语法需要对象?

中断的上半部分与下半部分

android 4.0 禁用系统home键

为啥阿里巴巴禁用select *