消息队列

消息队列

       一个任务运行时的数据和状态怎么告诉其他任务?信号量为任务间同步和互斥提供了提供了高效的方法,但它不能携带更多的任务信息。因而需要使用更高级的通讯方式,即消息队列和管道。这节主要讲消息队列。

消息队列的应用场景:

一对一:

图一 两个任务利用消息通讯

这是一种简单的应用模式。任务1 发送消息到消息队列1 中,任务2 从消息队列中1 接收消息,如果任务2 需要回应消息,就需要再创建一个消息队列2。

 

多对一:

这种多对一的应用模式类似于“客户——服务器”,任务3 作为服务器,侦听来自其它任务(客户)的请求,根据不同的任务和不同的请求内容单独发回应消息

 

    一种同步消息队列模型

在已故巨匠Stevens先生中的<<网络编程卷2>>中有记载使用互斥锁和条件变量来解决生产者/消费者的方法,在多线程编程中,我们也常常需要解决这样的生产者消费者问题。在实际项目中,我见到过很多种解决类似问题的同步消息队列,有的复杂而优雅,有得简陋而实用。

对于生产者,如果不考虑内存和队列的大小问题,只需要一直往消息队列里推消息就可以了。而对于消费者就要复杂一点了,在消息队列取空后,消费者可以循环轮询队列,直到取到新的消息,这种方式编码简单,但是费CPU时间片; 更加优雅的方法是当消息队列为空时,将消费者挂起,等到有消息可读时再唤醒。这里引用Stevens先生的方法,使用互斥锁和信号量实现了一个简单的同步消息队列模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值