生产者消费者问题(代码实现)
生产者-消费者问题(也被称为有界缓冲器问题)是一个典型的例子多线程同步的问题。问题描述了两个进程,生产者和消费者,谁都有一个共同的,固定大小的缓冲区作为一个队列。制片人的工作是生成数据,把它放入缓冲区,并重新开始。同时,消费者在消费数据(即,从缓冲器中移除),一次一个块。问题是确保生产者不会尝试将数据添加到缓冲区,如果它的全部,而且消费者不会尝试从空缓冲区删除数据。对生产者的解决方案是
生产者-消费者问题(也被称为有界缓冲器问题)是一个典型的例子多线程同步的问题。问题描述了两个进程,生产者和消费者,谁都有一个共同的,固定大小的缓冲区作为一个队列。制片人的工作是生成数据,把它放入缓冲区,并重新开始。同时,消费者在消费数据(即,从缓冲器中移除),一次一个块。问题是确保生产者不会尝试将数据添加到缓冲区,如果它的全部,而且消费者不会尝试从空缓冲区删除数据。
对生产者的解决方案是要么去当缓冲区已满睡觉或丢弃数据。下一次消费者从缓冲区中删除一个项目,它会通知生产者,谁再次开始填充缓冲区。以同样的方式,用户可以进入休眠状态,如果它发现该缓冲器是空的。下一次的生产者把数据放入缓冲器,它唤醒睡眠消费者。该溶液可以通过以下方式来达到的进程间通信,通常使用的信号量。一个不充分的解决方案可能会导致死锁,其中两个进程都在等待被唤醒。该问题也可推广到具有多个生产者和消费者。
接下来,我们来实现一个一个程序,它是功能是开两个线程,使一个数加到1W,也就是两个线程各加五千次,首先,我写出来以下程序:
然后,我们看看结果:
然而,我们并没有得到我们想要的答案,这是为什么呢?那我们先改变一下代码:
在看看结果:
在说这个程序,我们先来了解一个函数:
所以,我们接下来开始写消费者和生产者问题;
但是,他们既要有互斥,也要有同步,怎么实现同步呢?
所以,来看看结果:
所以,这样便可以。
PS:(关于线程的其他问题,在本人前几篇博文已经简述过了)
在这里,本人实现了一个消费者和一个生产者,如果换成多个消费者和多个生产者呢?
读者可以思考一下。
更多推荐
所有评论(0)