也就是说,一个进程在进入临界区时应得到锁;它在退出临界区时释放锁。函数 acquire() 获取锁,而函数 release() 释放锁,见图 1 。
图 1 采用互斥锁的临界区问题的解答
每个互斥锁有一个布尔变量 available,它的值表示锁是否可用。如果锁是可用的,那么调用 acquire() 会成功,并且锁不再可用。当一个进程试图获取不可用的锁时,它会阻塞,直到锁被释放。
按如下定义 acquire():
acquire() {
while (!available)
;/* busy wait */
available = false;;
}
按如下定义release():
release() {
available = true;
}
不过,自旋锁确实有一个优点,当进程在等待锁时,没有上下文切换(上下文切换可能需要相当长的时间)。因此,当使用锁的时间较短时,自旋锁还是有用的。自旋锁通常用于多处理器系统,一个线程可以在一个处理器上“旋转”,而其他线程在其他处理器上执行临界区。