void semWait ( semaphore s) { semWaitB ( mutex); s--; if ( s < 0){ semSignalB ( mutex); semWaitB ( delay); } else SemsignalB ( mutex ); } void semSignal ( semaphore s); { semWaitB ( mutex); s++; if ( s <= 0) semSignalB( delay ); semSignalB ( mutex); }
最初,s 被设置成期待的信号量值,每个 semWait 操作将信号量减 1 ,每个 semSignal 操作将信号最加l。二元信号量 mutex 初始化为 1 ,确保在更新 s 时保证互斥。二元信号量 delay 初始化为 0 ,用于阻塞进程。
下面的程序有一个缺点。请找出这个缺点,并提出解决方案。提示:假设有两个进程,每个都在s初始化为。时调用 semWait (s),当第一个刚执行semSignalB (mutex)但还未执行 semWaitB(delay) 时,第二个调用 semWait (s)并到达同一点。现在要做的是移动程序中的一行。