读者的动作有两个,一是填表进入阅览室,这时要考虑阅览室里是否有座位;一是读者阅读完毕,离开阅览室,这时的操作要考虑阅览室里是否有读者。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。算法的信号量有三个:seats——表示阅览室是否有座位(初值为100,代表阅览室的空座位数);readers——表示阅览室里的读者数,初值为0;用于互斥的mutex,初值为1。读者进入阅览室的动作描述getin:while(TRUE){P(seats);/*没有座位则离开*/P(mutex)/*进入临界区*/填写登记表;进入阅览室读书;V(mutex)/*离开临界区*/V(readers)}读者离开阅览室的动作描述getout:while(TRUE){P(readers)/*阅览室是否有人读书*/P(mutex)/*进入临界区*/消掉登记;离开阅览室;V(mutex)/*离开临界区*/V(seats)/*释放一个座位资源*/}