【发布时间】:2011-07-02 22:34:12
【问题描述】:
可以在信号量上执行的 P() 和 V() 操作是否保证原子性?信号量可以阻止两个进程进入 P() 吗?
【问题讨论】:
-
嗯,不是他们是,而是他们必须是。
标签: multithreading concurrency semaphore
可以在信号量上执行的 P() 和 V() 操作是否保证原子性?信号量可以阻止两个进程进入 P() 吗?
【问题讨论】:
标签: multithreading concurrency semaphore
假设我们有一个二进制信号量 s,其值为 1,并且两个进程同时尝试在 s 上执行 P。在 s 上的下一个 V 操作之前,这些操作中只有一个能够完成;试图执行 P 操作的其他进程被挂起。
摘自我的大学笔记:
我们可以认为如果 P 和 V 作为控制 访问资源:
当一个进程想要使用 资源,它执行 P 操作: 如果成功,它会递减 可用资源的数量和 过程继续;如果所有 资源当前正在使用中, 过程必须等待。
当一个进程完成时 资源,它执行 V 操作: 如果有进程在等待 资源,其中之一被唤醒;
如果没有等待进程, 信号量递增 说明现在有更多 资源免费。请注意, V 的定义没有指定哪个 如果多个进程被唤醒 进程已暂停在同一 信号量。
信号量可以解决互斥和条件同步问题。所以你的两个问题的答案都是:是的。
【讨论】:
如果我没记错的话,是的。它们需要确保一个线程无法获取资源,而另一个线程可以。如果不是,这意味着两个线程可以开始访问一个资源,然后从 CPU 中切换出来,而另一个进程可以访问它。这会扰乱一些事情。
更多信息请看这里:http://en.wikipedia.org/wiki/Semaphore_(programming)#Semantics_and_Implementation
【讨论】: