信号量必须是原子的原因是什么?

时间:2014-11-18 02:01:12

标签: operating-system semaphore mutual-exclusion

我正在学习信号量:sem_wait和sem_signal。 资源说信号量必须是原子的才能实现互斥 我不明白为什么他们必须是原子的?!如果不是,会发生什么?!

1 个答案:

答案 0 :(得分:2)

如果相互信号量实现不是原子的,那么会发生这种情况。假设我们使用此代码来实现信号量:

1 while (semaphore == locked) {
2   pause;
3 }
4 semaphore = locked;

假设处理器0和处理器1都想要锁定信号量,而其他一些处理器(#2)都有信号量。因此,处理器0和1都处于从第1行开始的while循环中。

一旦另一个处理器(#2)解锁了信号量,两个处理器(#0和#1)都可以退出它们各自的while循环,因为信号量现在已经解锁了。

现在处理器0和1都认为他们已经锁定了信号量。这很糟糕。

需要发生的是,信号量值和写入的读取必须相对于其他处理器是原子的。

如果不清楚,请发表评论 - 如果需要,我可以详细介绍。