while (s.count == 0) { //没有可用资源时,进入挂起状态;
调用进程进入等待队列s.queue;
阻塞调用进程;
}
s.count--; //有可用资源,占用该资源;
参考回答: 它的问题是,不能按FIFO进行信号量申请。 它的一种出错的情况
一个线程A调用P原语时,由于线程B正在使用该信号量而进入阻塞状态;注意,这时value的值为0。 线程B放弃信号量的使用,线程A被唤醒而进入就绪状态,但没有立即进入运行状态;注意,这里value为1。 在线程A处于就绪状态时,处理机正在执行线程C的代码;线程C这时也正好调用P原语访问同一个信号量,并得到使用权。注意,这时value又变回0。 线程A进入运行状态后,重新检查value的值,条件不成立,又一次进入阻塞状态。 至此,线程C比线程A后调用P原语,但线程C比线程A先得到信号量。