欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年ACE基本的多线程编程[ .pdf

    • 资源ID:33384877       资源大小:41.42KB        全文页数:6页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    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 页 - - - - - - - - -

    注意事项

    本文(2022年ACE基本的多线程编程[ .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开