2022年ACE基本的多线程编程[ .pdf
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 runningn); ACE_OS:sleep(4); return 0; ; int ACE_TMAIN(int, ACE_TCHAR *) ACE_DEBUG(LM_DEBUG, ACE_TEXT(%t) Main Thread runningn); 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 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 %dn), 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 runningn); for (int i=0; i rep_.update_device(i); return 0; private: HA_Device_Repository& rep_; ; int ACE_TMAIN(int, ACE_TCHAR *) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - 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 runningn); for (int i=0; i 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - /让阻塞的进程苏醒过来 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:/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - ACE_GUARD_RETURN宏的作用:这个宏会创建一个ACE_GUARD对象, ACE_GUARD对象用于对互斥锁的获取和释放。ACE_GUARD对象利用了对象构造和析构函数完成锁的获取和释放,也就是说在创建 ACE_GUARD对象时获取,在析构ACE_GUARD对象时释放锁。一般用花括号扩了起来, 目的就是通过 ACE_GUARD对象的作用域, 在括号结束时将锁释放。你可以自己创建一个ACE_Reactor 但是大多数时候,我们都是通过调用ACE_Reactor:instance() 这个静态方法来返回唯一的实例名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -