假设我们有一个二进制信号量s,其值为1,并且两个进程同时尝试在s上执行P操作。在下一次对s的V操作之前,只有其中一个操作才能完成;试图执行P操作的另一个进程将被挂起。来自我的大学笔记:我们可以将P和V视为控制对资源的访问: 当进程想要使用资源时,它执行P操作:如果成功,则减少可用资源的数量,进程继续进行;如果当前所有资源都在使用中,则进程必须等待。 当进程完成对资源的使用时,它执行V操作:如果有进程在等待该资源,则唤醒其中一个;如果没有等待进程,则增加信号量,表示现在有更多的空闲资源。请注意,V的定义不指定在同一个信号量上挂起了多个进程时唤醒哪个进程。信号量可以解决互斥和条件同步问题。因此,对于您的两个问题,答案都是:是的。
如果我没记错的话,是的。这样做是为了确保一个线程在占用资源时另一个线程不能获取它。如果不这样做,那么就意味着两个线程可以开始访问一个资源,然后被切换出 CPU,另一个进程可能会获得它。这会造成很大的混乱。更多信息请参见:http://en.wikipedia.org/wiki/Semaphore_(programming)#Semantics_and_Implementation