上一次提到了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;
}