生产者消费者问题
问题描述是:有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。
semaphore mutex=1,empty=n,full=0; item buffer[n]; //缓冲区 int in=out=0; //输入、输出指针 void producer() { do{ … 生产一个产品nextp; … wait(empty); //首先对empty--判断他是否小于0,小于0就自我阻塞(相当于看是否有空位子) wait(mutex); //拿到锁,否则就自我阻塞 buffer[in]= nextp; //往Buffer [in]放产品 in = (in+1) % n; signal(mutex); //释放锁 signal(full); //对full++判断是否<=0,如果是就唤醒进程 }while(true) } void consumer() { do{ …… wait(full); //首先对full--判断他是否小于0,小于0就自我阻塞(相当于看是否有产品可以消费) wait(mutex); //拿到锁,否则就自我阻塞 nextc = buffer[out]; //从Buffer [out]取产品 out = (out +1) mod n; signal(mutex); //释放锁 signal(empty); //对empty++判断是否<=0,如果是就唤醒进程 消费nextc产品; }while(true) } main() { cobegin{ producer(); consumer(); } //wait(x)是把x这个信号量进入临界区, signal(y)是把y这个信号量离开临界区。 注意:如果wait(full),wait(mutex)互换位置就会发生死锁