【转】ACE编程小结

转自: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。

时间: 2024-10-13 15:50:08

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

GDI编程小结

图形设备接口(GDI)是一个可运行程序,它接受Windows应用程序的画图请求(表现为GDI函数调用),并将它们传给对应的设备驱动程序,完毕特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Windows的全部图形输出,包含屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面.也就是Windows的图形编程. 一.GDI体系结构 1.  GDI32.DLL导出的函数 GDI提供几百个Windows程序中能够调用的函数.这些函数大多数是从Win32的子系统DLL GDI32.DLL

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的

sql编程小结之触发器

对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的sql语句,数据表为引用永久性表.不能将触发程序与TEMPORARY表或视图关联起来.可以从四个方面理解触发器: ---监视地点 table ---监视事件 insert/update/delete ---触发时间 after/before ---触发事件 insert/update/delete

Android开发实践:多线程编程小结

我们知道,Android系统为了提高程序的实时响应能力,不允许在UI线程中进行耗时的操作,否则会出现ANR异常,因此必须将耗时的任务放到非UI线程中执行.Android/Java提供了很多类来帮助大家完成异步操作,比如:Thread类,Timer类,AsyncTask类,HandlerThread类,以及Executor接口.这些类都分别在什么场合下使用呢? 本文简单地总结一下Android开发中常见的多线程类型和解决方案,并比较和分析了各个方案的区别,以便更好地理解和应用这些API接口. 1.

xshell编程小结

初步学完shell脚本编程,通过这篇博客对其小结一下 shell定义:shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序 shell脚本:我们可以在文本中输入一系列的命令.控制语句和变量,这一切有机的结合起来就形成了功能强大的shell脚本. 一.基础语法 查看系统脚本解释器 常用的是bash解释器 使用bash解释器执行脚本的三种方式: bash xx.sh sh xx.sh ./xx.sh(注意是否有权限,没有通过chmod 755 xx.sh 或chmod u+x xx.s

C#高级编程小结----集合的小小总结

集合的小结 以上文章介绍了如何处理不同类型的集合,数组的大小是固定的,但可以使用列表作为动态增长的集合.队列以先进先出的方式访问元素.栈以后进先出的方式访问元素.链表可以快速的插入和删除元素,但搜索操作比较慢.通过键和值可以使用字典,它的搜索和插入操作比较快.集用于唯一项,可以是无序的HashSet,也可以是有序的SortedSet<T>.ObservableCollection<T>提供了在列表中的元素变化发生时触发的时间. 版权声明:本文为博主原创文章,未经博主允许不得转载.

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

网络编程-小结

1-----------------------------------------------------基本知识---------------------------------------------------------------- 网络编程的三要素        A:IP地址            a:点分十进制            b:IP地址的组成            c:IP地址的分类            d:dos命令            e:InetAddress

Shell脚本编程小结

1.  描述shell程序的运行原理: Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送入内核去执行.内核是Linux系统的心脏,从开机自检时就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存.Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存执行.Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,