ACE 基本的多线程编程

opendocu

贡献于2014-06-20

字数:3958 关键词:

ACE基本的多线程编程(Basic Multithreaded Programming) 从ACE_Task_Base或ACE_Task派生你的线程对象,重载virtual int svc (void);虚函数,那就是线程的入口函数。 #include #include class HA_CommandHandler : public ACE_Task_Base { public:     virtual int svc(void)     {         ACE_DEBUG((LM_DEBUG,                    ACE_TEXT("(%t) Handler Thread running\n")));         ACE_OS::sleep(4);         return 0;     } }; int ACE_TMAIN(int, ACE_TCHAR *[]) {     ACE_DEBUG((LM_DEBUG,                ACE_TEXT("(%t) Main Thread running\n")));     HA_CommandHandler handler;     int result = handler.activate();     ACE_ASSERT(result == 0);     handler.wait();     return 0; } 在激活线程(activate()方法)之后,主线程会调用处理器对象上的wait()方法,等待其线程完成,然后在继续执行,并退出main()函数。 使用线程互斥体ACE_Thread_Mutex 如果成功获得互斥体,进行获取的线程(acquire())继续向前执行;否则它就会阻塞,直到该互斥体的持有者释放它(release())为止。 #include #include #include #include class HA_Device_Repository { public:     HA_Device_Repository()     { }     void update_device(int device_id)     {         //使用守卫         //ACE_GUARD(ACE_Thread_Mutex, mon, mutex_);         ACE_Guard guard(this->mutex_);         //mutex_.acquire();         ACE_DEBUG((LM_DEBUG,                    ACE_TEXT("(%t) Updating device %d\n"),                    device_id));         ACE_OS::sleep(1);         //mutex_.release();     } private:     ACE_Thread_Mutex mutex_; }; class HA_CommandHandler : public ACE_Task_Base { public:     enum {NUM_USES = 10};     HA_CommandHandler(HA_Device_Repository& rep) : rep_(rep)     { }     virtual int svc(void)     {         ACE_DEBUG((LM_DEBUG,                    ACE_TEXT("(%t) Handler Thread running\n")));         for (int i=0; i < NUM_USES; i++)             this->rep_.update_device(i);         return 0;     } private:     HA_Device_Repository& rep_; }; int ACE_TMAIN(int, ACE_TCHAR *[]) {     HA_Device_Repository rep;     HA_CommandHandler handler1(rep);     HA_CommandHandler handler2(rep);     handler1.activate();     handler2.activate();     handler1.wait();     handler2.wait();     return 0; } 使用守卫(Using Guards) 当然你在上面的代码中你已经看到了我已经使用了守卫(Guards)。 在许多的情况下,异常情况会在本可以完好运行的代码中造成死锁(忽略了某个异常路经、忘记释放互斥体)。 守卫(Guards)基于一种常见的C++惯用手法:把构造器和析构器用于资源的获取和释放。 在栈上使用守卫(Guards),你就总能保证锁的释放,不管你的代码所走的是什么样的非正常路径。 ACE Guard Classes Guard Description   ACE_Guard  Uses the acquire() and release() methods of lock class T during guard creation and destruction. Thus, you get the semantics of acquire() and release() methods for the specified type T.   ACE_Read_Guard  Uses acquire_read() for acquisition instead of the regular acquire().   ACE_Write_Guard  Uses acquire_write() for acquisition instead of the regular acquire().   ACE_TSS_Guard  Allocates the guard _disibledevent=>     }     int is_owner (ACE_Task_Base* tb)     {         return (this->owner_ == tb);     }     ACE_Task_Base* get_owner(void)     {         return this->owner_;     }     void set_owner(ACE_Task_Base* owner)     {         this->owner_ = owner;     } }; class HA_CommandHandler : public ACE_Task_Base { private:     HA_Device_Repository& rep_;     ACE_Thread_Mutex& mutex_;     ACE_Condition& waitCond_; public:     enum {NUM_USES = 10};     HA_CommandHandler(HA_Device_Repository& rep,                     ACE_Condition& wait,                     ACE_Thread_Mutex& rep_mutex)                     : rep_(rep),                         waitCond_(wait),                         mutex_(rep_mutex)     { }     virtual int svc(void)     {         ACE_DEBUG((LM_DEBUG,             ACE_TEXT("(%t) Handler Thread running\n")));         for (int i=0; i < NUM_USES; i++)         {             this->mutex_.acquire();             while (!this->rep_.is_free())                 //阻塞,进入休眠                 this->waitCond_.wait();             this->rep_.set_owner(this);             this->mutex_.release();             this->rep_.update_device(i);             ACE_ASSERT(this->rep_.is_owner(this));             this->rep_.set_owner(0);             //让阻塞的进程苏醒过来             this->waitCond_.signal();                         //让苏醒过来的进程有机会获得条件变量             ACE_OS::sleep(1);                 }         return 0;     } }; int ACE_TMAIN(int, ACE_TCHAR *[]) {     HA_Device_Repository rep;     ACE_Thread_Mutex rep_mutex;     ACE_Condition wait(rep_mutex);     HA_CommandHandler handler1(rep, wait, rep_mutex);     HA_CommandHandler handler2(rep, wait, rep_mutex);     handler1.activate();     handler2.activate();     handler1.wait();     handler2.wait();     return 0; } 2)消息(数据)传递(Message Passing)。   消息块(Message Blocks) ACE_Message_Block 一种高效的数据容器,可以用来高效的存储和共享消息。支持引用计数和数据共享特性。 rd_ptr()指针,指向要读取的下一个字节,; wr_prt()指针,指向下一个可用的空字节; copy()方法把数据复制到消息块; msg_type()修改类型字段。 一旦你使用完了消息块,要用release()方法释放它,使引用计数减一,当引用计数到达0时,ACE会自动释放这个块分配的内存。  http://www.sodao.com/u/wuxiaoming1733/blog/detail/36bde821b47718445b   ACE_GUARD_RETURN宏的作用:这个宏会创建一个ACE_GUARD对象,ACE_GUARD对象用于对互斥锁的获取和释放。 ACE_GUARD对象利用了对象构造和析构函数完成锁的获取和释放, 也就是说在创建ACE_GUARD对象时获取,在析构ACE_GUARD对象时释放锁。 一般用花括号扩了起来,目的就是通过ACE_GUARD对象的作用域,在括号结束时将锁释放。 你可以自己创建一个ACE_Reactor 但是大多数时候,我们都是通过调用ACE_Reactor::instance()这个静态方法来返回唯一的实例

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档