转自:http://blog.csdn.net/mjp_mjp/article/details/4406059

1、多线程中的ACE_Reactor::EventLoop,当在多线程(池)中调用EventLoop时,需要注意,在Acceptor/EventHandler中要使用其中的方法Reactor()来获取ACE_Reactor的指针,不要使用ACE_Reactor::instance,道理很简单哟。不过,一定要注意,在编程时,使用Reactor()类方法,比使用单件的方法要好很多,起码安全,也不会破坏封装性。

2、ACE_Task中的Msg_Queue,这个类的确很迷人,不过要注意getq和putq都可能会引起阻塞,因此,最好使用超时的方式来调用它们,特别是在结束这个task时候。因为,你要清空msg_queue,如果不超时,你可能无法安全的退出线程。

3、ACE_Svc_Handler,这个类很好,它继承于ACE_Task,因此它有msg_queue,还可以被用于ACE的组件配置模型中。其中对于handle_output,要注意,因为它不会自动被框架调用,除非你使用了策略类ACE_Reactor_Notification_Strategy(msg_queue需要它,windows下用的是完成端口),它使用流控制方式通知你可以写。而且,在handle_output内,不要吝惜,一定要使用while,把msg_queue里面的message_block尽可能全部取出,然后发送出去(直到send返回-1,errono=EWOULDBLOCK)。

4、Acceptor/Handler,要在end_event_loop之前被清除。如果使用了new创建acceptor的话,最好在end_event_Loop前,注销它,即在handle_close时用参数DONT_CALL注销,并delete。如果你是在end_event_loop 后在删除它的话,ACE保证会让你遇到无法让你冷静的崩溃断言等致命错误 。有一种思想,就是如果new出来的对象指针,在程序退出前,一直没有变化,也就是说,对象依然被你掌控的话,你可以不用去delete,而且,这个也不叫内存泄露。因为现在的操作系统,在进程被杀死后,会清理进程使用过的空间。

5、善使局部类(在函数体中声明定义的类),严格意义上讲,这个不是ace范畴。局部类对象,可以共享全局/静态的数据,但是不能直接使用函数体内的数据;或者成员函数所在类内的变量,不过可以使用所在类指针,访问类的私用成员。这个很强悍,可以做一些很私密的处理。而且,可以利用这一点,返回一个局部类对象指针(当然是void*),而c++保证,外界无法访问访问它,更不能删除它。

6、EMSGSIZE,这个errorcode,我当初没有理解,只是在实践中碰到了,当你请求的数据length,小于实际数据长度时,会有这个error。这时,我们可以采取约定的方式,即,我们每次不得发送数据长度超过MTU的包,接收当然也不会超过这个数值。也不会报这个error。而且这样做有好处,起码可以防止别人恶意发送长度很大的包来攻击你。而且,更重要的是,小于MTU的数据不会被分包传输,数据安全而且可靠。这点对tcp/udp同样适用哟。

7、ace用于mfc环境,或者说用于共享库(dll、so等)时,最好在使用前使用ACE::init初始化一下,并在退出前使用ACE::fini。

【转】ACE编程小结的更多相关文章

  1. Linux多线程编程小结

     Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...

  2. Windows Store 手势编程小结

    Windows Store 手势编程小结 最近完成了一个Windows Store上面的手势操作的页面.在这里总结了一下经验和心得,希望能和大家一起分享和讨论一下. 首先,要纠正一个误区,在Windo ...

  3. [2019BUAA软工助教]结对编程 - 小结

    [2019BUAA软工助教]结对编程 - 小结 一.评分规则 博客 博客共五十分 序号 要求 分值 1 在文章开头给出Github项目地址 1 2 在开始实现程序之前,在下述PSP表格记录下你估计将在 ...

  4. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  5. sql编程小结

    对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...

  6. Android JNI&NDK编程小结及建议

    前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签 ...

  7. IOCP编程小结(中)

    上一篇主要谈了一些基本理念,本篇将谈谈我个人总结的一些IOCP编程技巧. 网络游戏前端服务器的需求和设计 首先介绍一下这个服务器的技术背景.在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计. ...

  8. C# 异步编程小结

    APM 异步编程模型,Asynchronous Programming Model EAP 基于事件的异步编程模式,Event-based Asynchronous Pattern TAP 基于任务的 ...

  9. iOS GCD 编程小结

    一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...

随机推荐

  1. 卷积相关公式的matlab代码

    取半径=3 用matlab代码实现上式公式: length=3;for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj,K ...

  2. 关于java中split的使用

    之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊.题目大概是这样的: ) ...

  3. 【总结】杂谈Java异常处理

    软件开发中一个古老的说法是:80%的工作使用20%的时间.80%是指检查和处理错误所付出的努力.在许多语言中,编写检查和处理错误的程序代码很乏味,并使应用程序代码变得冗长.原因之一就是它们的错误处理方 ...

  4. USACO Section 3.1: Score Inflation

    完全背包问题 /* ID: yingzho1 LANG: C++ TASK: inflate */ #include <iostream> #include <fstream> ...

  5. code manager tools git的使用;

    git的使用 一.下载及安装: 1.下载:https://github.com 2.安装: 二.常用命令: 查看.添加.提交.删除.找回,重置修改文件 git help< command> ...

  6. BZOJ 2754 喵星球上的点名(后缀数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2754 题意:给出n个字典串,m个询问串.输出每个询问串出现在多少个字典串中.最后输出每个 ...

  7. HDFS的java操作方式

    1.RPC 1.1 RPC (remote procedure call)远程过程调用. 远程过程指的是不是同一个进程. 1.2 RPC至少有两个过程.调用方(client),被调用方(server) ...

  8. Photoshop图层混合模式计算公式大全(转)

    混合模式可以将两个图层的色彩值紧密结合在一起,从而创造出大量的效果.在这些效果的背后实际是一些简单的数学公式在起作用.下面我将介绍photoshop cs2中所有混合模式的数学计算公式.另外还介绍了不 ...

  9. aptana studio 3支持jquery

    首先要说的一点是,如果你不使用PortableGit,就不要安装,否则New From Template中会缺失大部分模板.至于还有什么缺陷,暂时没测出来,本人也是刚玩aptana studio 3哈 ...

  10. 用Visio画UML顺序图

    1.顺序图 顺序图又称为时序图,顾名思义,它着重表现的是对象间消息传递的时间顺序.顺序图描述的对象也是一个用例,即一组行为操作,而它表现的是这组行为的先后关系(纵坐标),以及每个行为是属于哪个对象的( ...