ACE:任务间通信

上一次提到了ACE中的主动对象,其实每一个任务都有一个消息队列,这个消息队列可用作任务间通信的一种方式。当一个任务想要与另一个任务通信时,他创建一个消息,

并将消息放入它想通信的任务的消息队列中。另一个任务用getq()方法来获得这个消息。如果队列中没有消息,任务就进入休眠状态。


下面的例子演示如何进行任务间通信,生产者产生数据并放到消费者的消息队列中,消费者从队列中取出数据,并进行处理。


#include "ace/Task.h"
#include "ace/Message_Block.h"
#include "ace/Synch.h"




class Consumer:public ACE_Task<ACE_MT_SYNCH>
{
public:
Consumer(){}
int open(void*)
{
ACE_DEBUG((LM_DEBUG,"【%t】 consumer task open\n"));


activate(THR_NEW_LWP,1);


return 0;
}


int close(u_long)
{
ACE_DEBUG((LM_DEBUG,"【%t】consumer task closed\n"));
return 0;
}


int svc(void)
{
ACE_Message_Block *mb=0;
do{
mb=0;
getq(mb);
ACE_DEBUG((LM_DEBUG,"【%t】get 【%d】message from queue\n",
*mb->rd_ptr()));
}while(*mb->rd_ptr()<10);


return 0;
}
};


class Producer:public ACE_Task<ACE_MT_SYNCH>
{
public:
Producer(Consumer *consumer):
 _consumer(consumer),_data(0)
{
_mb = new ACE_Message_Block((char*)&_data,sizeof(_data));
}


int open(void*)
{
ACE_DEBUG((LM_DEBUG,"【%t】Producer task open\n"));


activate(THR_NEW_LWP,1);


return 0;
}


int svc(void)
{
while(_data<11)
{
ACE_DEBUG((LM_DEBUG,"【%t】producer send 【%d】message to queue\n",_data));
_consumer->putq(_mb);


ACE_OS::sleep(1);
_data++;
}


return 0;
}


int close(u_long)
{
ACE_DEBUG((LM_DEBUG,"【%t】producer closed down\n"));
return 0;


}


private:
char _data;
Consumer *_consumer;
ACE_Message_Block *_mb;
};




int main(int argc,char* argv[])
{
Consumer *consumer = new Consumer();
Producer *producer = new Producer(consumer);


producer->open(0);
consumer->open(0);


ACE_Thread_Manager::instance()->wait();




return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值