读者写者模型与生产者消费者模型

读者写者模型
读者写者访问一块共享的数据区域,读者对共享资源进行读访问,写者对共享内存进行写操作。在多处理器系统中,运去多个读者同时访问共享内存,而写者是排他性的,每次只能有一个写者去写入数据。在使用读写锁时,一个读写锁只能同时一个读者和多个写者,但不能同时既有读者又有写者。
公平情况的读者写者代码:
这里写图片描述
这里写图片描述
运行结果
这里写图片描述
此时读者和写者有相同的机会运行,是公平情况。
读者写者有三类情况:读者优先,写者优先,公平情况
1、读者优先
读者先来读取数据(其他的读者也可以来读取数据),此时写者等待,也就是说读者可以插写者的队,这是读者优先的关键点,只有当读者为0,写者才能来写入数据。
1、写者要有一个互斥信号量 writeMutex=1,因为写者一次只能一个来写数据
2、对读者要有一个记录数目的 int 变量,readcount=0,一个互斥信号量readMutex = 1,保证多个读者来的时候,能似的 readcount 互斥的变化,也就是不被混乱的计数。
2、写者优先
类似读者优先算法,同理,这里是写者可以插队,多用一个 readable 信号量,控制写者可以优先于读者进入临界区,一个整数 writecount 统计写者,而 wmutex 控制写者互质访问 writecount
3、公平情况
读者想进的时候,有写者正在写(或者正在等待写),读者就不能进(读者等待),只有写者走了,读者才能进。和一相比,需要多一个信号量 wmutex=1,表示是否存在写者正在写或者等待写,如果存在,读者就等待,读者不能插队了。
生产者消费者模型
从下图中可以看出来生产者和消费者之间用一个类似队列的容器来存放产品,生产者只需要关心这个仓库,并不需要关心具体的消费者是谁,甚至都不知道这个消费者的存在。对于消费者而言他不需要关心具体的生产者,他只需要关心这个仓库中有没有产品。
这里写图片描述
基于固定大小的环形队列(信号量实现)
代码展示
这里写图片描述
这里写图片描述
这里写图片描述
运行结果
这里写图片描述
在程序中用信号量来实现生产者和消费者的同步,生产者在生产产品后会进行sem_post()操作释放资源(V操作),消费者sem_wait()获得资源,开始向下执行,消费者在消费后会对生产者进行sem_post()操作,从而实现消费者和生产者之间的同步。
借助链表实现消费者生产者模型(条件变量实现)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
运行结果
这里写图片描述
上面的代码展示的是多个生产者消费者模型,在产品较多时,两个消费者均可以消费到,在只有一个产品时,消费者发生了竞争,两个消费者均可能有机会消费到数据。代码中使用条件变量实现了消费者生产者之间的同步,pthread_cond_wait()函数令线程等待,直至其他线程调用pthread_cond_signal()唤醒某个在condition variable上等待的另一个线程,或者使用pthread_cond_broadcast()唤醒等待的所有线程,线程之间通过竞争来判断哪个线程先运行。
读者写者模型和生产者消费者模型区别
读者写者模型中写者写入数据,但读者并不会消费数据,只会访问。其中的写操作是排他的(排斥读者和其他写者),读操作是共享的。
生产者消费者模型中生产者生产产品,消费者不断的消费产品,产品的数量在不断的下降。如果此时临界区无数据时,消费者被阻塞,直至生产者生产出数据时来唤醒消费者,若临界区资源满了时,生产者被阻塞,在消费者消费后唤醒生产者。(待完善)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值