我正在学习信号量:sem_wait和sem_signal。 资源说信号量必须是原子的才能实现互斥 我不明白为什么他们必须是原子的?!如果不是,会发生什么?!
答案 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都认为他们已经锁定了信号量。这很糟糕。
需要发生的是,信号量值和写入的读取必须相对于其他处理器是原子的。
如果不清楚,请发表评论 - 如果需要,我可以详细介绍。