生产者消费者模型(二)(基于环形队列)

2017-06-02 09:30 阅读 392 次 评论 1 条

多元信号量

二元信号量是只取0值和1值的信号量,如果对此有不解之处请阅读我的另外一篇博客IPC:信号量

多元信号量也称为计数信号量或一般信号量。用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行,初始化、递减和增加,这三种操作均是原子操作。递减操作可以用于阻塞一个进程,增加操作可以用于接触阻塞一个进程。

信号量的接口函数:

① sem_init:初始化信号量。

参数sem:创建的信号量。使用sem_t可以来创建,信号量的类型为sem_t。

参数pshared:通常为0,表示信号量用于同一进程的线程间通信。

参数value:可用资源的数量。

返回值:成功返回0,失败返回错误码。(下列接口函数的返回值与此一致)

② sem_wait:获取信号量,即P操作,信号量的值减一,失败后挂起等待。

③ sem_trywait:尝试获取信号量,即P操作,信号量的值减一,失败后不挂起等待。

④ sem_post:释放信号量,即V操作,信号量的值加一,同时唤醒挂起等待的线程。

⑤ sem_destroy:销毁信号量。

环形队列模拟生产者消费者模型

在上一篇博客中提出了3、2、1原则,环形队列的实现仅仅改变了这一个交易场所,由之前的单链表变为了环形队列,因此依旧属于单生产单消费的模式,这样也就不用考虑队空与队满,两个信号量针对的是队列下标为0的位置,即生产一条,消费一条。

对上图的解释是:n代表队列的大小,生产者关心的是格子资源blank_sem,所属区间为[n,0];消费者关系的是数据资源,所属区间为[0,n]。

使用环形队列更多的时候,是因为生产者与消费者的速度不匹配问题,比如下面整个示例,我们让消费者晚一秒消费,为了看清楚现象,我们将队列大小改为5进行验证。

当我们将队列大小改为5之后就可以看清楚了,上图中生产者在一瞬间生产了5个数据,消费者再从队列里拿出数据,二者匹配处数据不一致是因为队列是先进先出,从头部拿数据。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:生产者消费者模型(二)(基于环形队列) | 术与道的分享
分类:操作系统 标签:, ,
1024do.com导航_术与道导航平台

发表评论


表情

  1. alanxgorlan
    alanxgorlan 【队长】 @回复

    [强] [强] [强]