生产者消费者问题(代码实现)

生产者-消费者问题(也被称为有界缓冲器问题)是一个典型的例子多线程同步的问题。问题描述了两个进程,生产者和消费者,谁都有一个共同的,固定大小的缓冲区作为一个队列。制片人的工作是生成数据,把它放入缓冲区,并重新开始。同时,消费者在消费数据(即,从缓冲器中移除),一次一个块。问题是确保生产者不会尝试将数据添加到缓冲区,如果它的全部,而且消费者不会尝试从空缓冲区删除数据。


对生产者的解决方案是要么去当缓冲区已满睡觉或丢弃数据。下一次消费者从缓冲区中删除一个项目,它会通知生产者,谁再次开始填充缓冲区。以同样的方式,用户可以进入休眠状态,如果它发现该缓冲器是空的。下一次的生产者把数据放入缓冲器,它唤醒睡眠消费者。该溶液可以通过以下方式来达到的进程间通信,通常使用的信号量。一个不充分的解决方案可能会导致死锁,其中两个进程都在等待被唤醒。该问题也可推广到具有多个生产者和消费者。


接下来,我们来实现一个一个程序,它是功能是开两个线程,使一个数加到1W,也就是两个线程各加五千次,首先,我写出来以下程序:

生产者消费者问题(代码实现)_第1张图片


然后,我们看看结果:


然而,我们并没有得到我们想要的答案,这是为什么呢?那我们先改变一下代码:

生产者消费者问题(代码实现)_第2张图片

在看看结果:



在说这个程序,我们先来了解一个函数:

生产者消费者问题(代码实现)_第3张图片

生产者消费者问题(代码实现)_第4张图片

所以,我们接下来开始写消费者和生产者问题;

但是,他们既要有互斥,也要有同步,怎么实现同步呢?

生产者消费者问题(代码实现)_第5张图片

生产者消费者问题(代码实现)_第6张图片

所以,来看看结果:

生产者消费者问题(代码实现)_第7张图片

生产者消费者问题(代码实现)_第8张图片

所以,这样便可以。

PS:(关于线程的其他问题,在本人前几篇博文已经简述过了)

在这里,本人实现了一个消费者和一个生产者,如果换成多个消费者和多个生产者呢?

读者可以思考一下。

你可能感兴趣的:(生产者消费者问题(代码实现))