深入理解生产者与消费者问题

缓冲区的形象理解:
缓冲区好像使用一条传送带替代托架,传送带上一次可以放多个产品。
生产者在缓冲区尾加入数据,消费者在缓冲区头读取数据。缓冲区满时,缓冲区上锁并等待消费者线程读取数据;
每一个生产或消费动作使得传送带向前移动一个单位。因此,消费者读取数据的顺序与数据产生顺序相同。

引入一个count计数器表示已经被使用的缓冲区数量。

hNotEmptyEvent 和 hNotFullEvent来同步生产者和消费者线程。

每当生产者线程发现缓冲区满(count = BufferSize)
它就等待hNotEmptyEvent事件。

同理,当消费者线程发现缓冲区空,就开始等待hNotEmptyEvent。

生产者线程写入一个新的数据后,立刻发出hNotEmptyEvent来唤醒正在等待的消费者线程;

消费者线程在读取一个数据之后,就发出hNotFullEvent来唤醒正在等待的生产者线程。

程序设计的思想:
①设置while 循环 pi生产者访问临界区,得到权限访问缓冲区,如果缓冲区满,则等待。
②直到缓冲区非满,访问互斥锁,当得到互斥锁且缓冲区非满时,跳出while循环,开始生产新的数据,并把数据存放在Buffer缓冲区中,当数据存放结束则结束临界区;接着唤醒消费者线程;
?ci消费者访问临界区,得到权限访问缓冲区,如果缓冲区尾空,则没有可以处理的数据,则释放互斥锁且等待,直到缓冲区非空;
④缓冲区非空时,跳出while循环;

?消费者获得数据,并根据所获得的数据按类别消费。处理完数据后,结束临界区;接着唤醒生产者线程。

你可能感兴趣的:(操作系统)