这个问题是一个标准的、著名的同时性编程问题的集合:一个有限缓冲区和两类线程, 它们是生产者和消费者,生产者把产品放入缓冲区,相反消费者便是从缓冲区中拿走产品。
须等待,直到缓冲区中有产品才能继续读取。
是一个含竞争条件的生产者-消费者问题实例。
便是缓冲区中产品的数目,初始化为0。producer函数是生产者函数,produce_item(&item );是指生产者生产出来一个产品,但是这时候并没有对缓冲区进行操作。而if (count==N) sleep();是测试语句,如果生产出来的产品数和缓冲区大小相等时,生产者就进入睡眠状态 。如果不等,产品就放入缓冲区内,并且产品数增加1。if (count==1) wakeup(consumer); 这条语句看上去让人十分费解,其实它的意思是,如果上一次操作时产品的数目为0,消费 者已经进入了睡眠状态,而现在生产者又生产出来一个产品,缓冲区内不为空,这时把消费 者唤醒。消费者函数也是同样的道理,只不过一个是取,另一个是放。
数据产生的作用要依赖于线程的调度顺序的。当两个线程竞相访问同一数据时,就会发生竞 争条件。由于时间片的原因,一个线程可以在任意一个时刻打断其他线程,因此数据可能会 被破坏或者被错误地解释。在这个实例上反应的结果是,生产者和消费者两个进程都永远睡 眠。至于有哪些解决方案,以后再慢慢讨论。 |
生产者-消费者问题
最新推荐文章于 2022-12-13 20:54:48 发布
在学习进程互斥中,有个著名的问题:生产者-消费者问题。