fantiejun0436的专栏

5.2 ACE_Task(任务)

每个ACE_Task对象都包含一个或多个线程和一个底层的消息队列.任务之间可以是通过这些消息队列进行通信. (用putq()来插入用getq()来提取.)

它做好了框架. 我们只要在派生的实际任务类中提供那些用以回调的模板方法就可以了.

5.2.2 创建和使用任务(ACE_Task).要使用ACE_Task. 先从它派生一个子类. 然后:实现初始化和终止方法: 即open()和close().调用"启用"方法: 即activate(). 调用它之后. 会创建一定数量(由参数指定)的线程. 而这些线程的函数就是svc().实现svc().///////////////////////////////////////////// 例子. 用ACE_Task来实现 生产者-消费者. // 演示了怎么用ACE_Task类中的消息队列实现任务之间的通信.// 来自 <<ace程序员教程>> 59页///////////////////////////////////////////// 消费者#include "ace/os.h"#include "ace/Task.h"#include "ace/Message_Block.h"//消费者class Consumer : public ACE_Task<ACE_MT_SYNCH> { //从ACE_Task派生public:int open(void*) {ACE_DEBUG((LM_DEBUG, "(%t) Producer task opend/n"));activate(THR_NEW_LWP, 1); // 必须调用该成员函数. 不明白既然要这样. 怎么不把activate和open的功能用一个函数呢?return 0;}int svc(void) { //实际的线程函数. 在activate函数被调用后就自动创建线程来执行这个函数.ACE_Message_Block * mb = 0;do {mb = 0;getq(mb); //从消息队列中取出一个消息到mb. 若当前的消息队列中没有消息. 则阻塞.ACE_DEBUG((LM_DEBUG, "(%t)Got message: %d from remote task/n", *mb->rd_ptr()));} while(*mb->rd_ptr() < 10);return 0;}int close(u_long) {//在任务完成后自动执行的一个函数.ACE_DEBUG((LM_DEBUG, "Consumer closes down /n" ));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_));// 这个new出来的消息不需要删除么??????}int open(void*){ACE_DEBUG((LM_DEBUG, "(%t) Producer task opened /n"));activate(THR_NEW_LWP, 1); //创建生产者线程. 线程函数是svc();return 0;}int svc() { while (data_<11) {ACE_DEBUG((LM_DEBUG, "(%t)Sending message: %d to remote task /n", data_));consumer_->putq(mb_); //向消费者的消息队列中放入一个消息.ACE_OS::sleep(1);data_++;}return 0;}int close(u_long){ACE_DEBUG((LM_DEBUG, "Producer closes 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);}5.3 主动对象模式

什么是主动对象?先说说普通的对象. 我们调用它的方法时. 这些方法是在调用它的线程中执行的. 但主动对象则拥有自己的线程. 只要告诉主动对象该做什么就行了. 它会在自己的线程中处理. 而不是在主线程中(即调用是异步进行的).

不敢面对自己的不完美,总是担心自己的失败,

fantiejun0436的专栏

相关文章:

你感兴趣的文章:

标签云: