我是同步的初学者,我在关键部分遇到了一些问题,我知道锁定关键部分可以确保同步。
// Some Code
Acquire_lock(){disable Interrupts;}
Critical section //Interrupt occurs and arrives to acquire the same lock.
Release_lock(){enable Interrupts;}
我的问题是:为什么在获取关键部分的锁时禁用中断?
答案 0 :(得分:1)
请注意以下内容适用于Unix / Linux,不确定它是否也适用于Windows。
如果获得锁定,则锁定由当前进程“拥有”。即如果其他进程尝试使用相同的锁,则会阻止其他进程。
由于锁是整个流程所拥有的,因此它们不足以有效地阻止同时访问内部流程。 (这会计算并发线程和中断处理程序)。
例如假设一个进程获得一个锁,然后发生一个中断。这导致调用该信号的中断处理程序,可能在您的关键部分中间。现在假设中断处理程序尝试获取相同的锁(因为它也想调用相同的临界区)。这将起作用(因为该进程已经具有锁定。)
换句话说,中断处理程序不会被主线程所采用的锁停止。因此,为了使主线程的锁有效,中断处理程序也必须暂时停止。
对于Unix / Linux中的多线程应用程序,有一组不同的系统调用要进行同步,因此上述问题对于单线程应用程序中的中断处理程序而言比对并发线程更为严重。
注意:订单应为