ACE的陷阱
文章平均质量分 71
fullsail
一个写了14年代码的人,坐在这个角落,看眼前人来人往!
展开
-
ACE的陷阱
ACE的陷阱坦白说,使用这个标题无非是希望能够吸引你的眼球,这篇文章的目的仅仅是为了揭示一些ACE缺陷的。文章适合的读者是对ACE(ADAPTIVE Communication Environment)有一定研究,或者正在使用ACE从事项目开发的人士参考。如果你对C++还是新手,甚至包括ACE知识初学者,(但你想飞的更高),建议你收藏这篇文档以后阅读。秉承陷阱系列文章的传统,我只是通原创 2008-09-08 23:05:00 · 1778 阅读 · 0 评论 -
Event_Handler在程序退出前应该自己关闭
10 Event_Handler在程序退出前应该自己关闭在程序退出的【注】,我们往往不会自己关闭Event_Handler,而寄希望Reactor 的清理。但是实际情况会复杂很多。使用的时候必须当心。 【注】是否要在退出的时候清理所有分配的内存?在普通的操作系统中,程序的退出会回收所有的分配内存。所以很多人会逃避在最后阶段的清理分配的内存。但是这实在不是一个良好原创 2008-09-12 03:12:00 · 2986 阅读 · 2 评论 -
调整系统时钟导致ACE定时器丢失
11 调整系统时钟导致ACE定时器丢失由于我们采用的服务器一般都是靠纽扣电池作为能源驱动和记录时钟,一般在运行一段时间后都会出现时间误差。所以很多大规模的分布系统都有校时操作,特别是一些对时钟要求精确的分布式系统(比如计费等),往往都会有一个主机提供精确时钟服务(其可能采用GPS校时),其他服务器通过这台服务器校时,校时操作一般都是直接改变系统时钟。ACE的定时器都是采用E原创 2008-09-12 03:15:00 · 2878 阅读 · 0 评论 -
ACE的CDR中的字节对齐问题
12 ACE的CDR中的字节对齐问题大家应该都知道计算机中间都有字节对齐问题。CPU访问内存的时候,如果从特定的地址开始访问一般可以加快速度,比如在32位机器上,如果一个32位的整数被放在能被32模除等于0的地址上,只需要访问一次,而如果不在,可能要访问两次。但是这样就要求一些数据从特定的地址开始,而不是顺序排放(中间会有一些空余的地址),这就是字节对齐。而ACE C原创 2008-09-12 03:23:00 · 2999 阅读 · 1 评论 -
ACE_Time_Value的赋值效率
15 ACE_Time_Value的赋值效率ACE_Time_Value是使用ACE会大量使用类。但是他的部分函数没有高效的实现。比如构造函数:ACE_INLINEACE_Time_Value::ACE_Time_Value (time_t sec, suseconds_t usec)和set函数ACE_INLINE voidACE_Time_原创 2008-09-12 03:27:00 · 5239 阅读 · 0 评论 -
非阻塞网络函数封装不一致
16 非阻塞网络函数封装不一致ACE的非阻塞网络函数参数设计有不合理的地方。ACE_SOCK_Stream和ACE_SOCK_Connector在非阻塞的的调用的接口对于ACE_Time_Value *timeout参数的使用不一致,一个要使用NULL,一个却要使用ACE_Time_Value::zero。ACE_SOCK_Stream,非阻塞调用send函数的时候【原创 2008-09-12 03:29:00 · 3020 阅读 · 7 评论 -
过于前卫的Makefile方式
17 过于前卫的Makefile方式这个”陷阱”的说法有点吹毛求疵,ACE提供了一种很前卫的Makefile方式,他定义了Makefile的基础变量,以及包括规则。如果使用他来辅助Makefile的书写,特别是在跨平台开发中,你可以大大节省Makefile开发时间。BIN = hello_aceBUILD = $(VBIN)SRC = $(addsuf原创 2008-09-12 03:31:00 · 2783 阅读 · 0 评论 -
尽量使用STL而不是ACE的容器
13 尽量使用STL而不是ACE的容器这个纯属个人感觉(偏见)。我有如下理由不使用ACE的容器:l 一些实现不符合大家对于容器的认识,比如ACE_DLList,在其中存放的居然是对象的指针而不是拷贝。你还必须记住去释放ACE_DLList内部管理的指针。l ACE容器的迭代器不符合STL的要求,从而造成ACE的容器无法使用STL的各种模板算法和原创 2008-09-12 03:25:00 · 2192 阅读 · 1 评论 -
共享内存的与位置无关分配?
18 共享内存的与位置无关分配?在文档《ACE Programmers Guide, The: Practical Design Patterns for Network and Systems Programming》中介绍了一种与位置无关的共享内存分配,但是实际上这种方式并不是太理想。按照文章中的介绍的方式,其实主要是采用ALWAYS_FIXED参数,使用制定的基地址作为原创 2008-09-12 03:33:00 · 2396 阅读 · 0 评论 -
ACE_DEBUG的溢出错误
ACE_DEBUG的溢出错误 这个bug又是inmore发现,错误定位ACE_DEBUG在字符串处理中,可能会引发abort。这个bug在5.6.X,和5.4.X(不能确认),5.7.0的版本都存在,我提交了相应的bug后,也许会在5.7.1版本修正。我们可以用一个简单的程序验证这个BUG。#include #include #include int main(原创 2009-07-13 23:21:00 · 3840 阅读 · 2 评论 -
MSVC2005 +STLPort 编译ACE失败
MSVC2005 +STLPort 编译ACE失败这个问题应该在ACE的5.6到5.7.5的的版本存在。目前我已经提交了bug,应该可以得到解决。常看我Blog的人应该知道(就那么点浏览量,纯属吹牛),我是一个MSVC的Dinkumware STL的怀疑者,我一方面觉得某些实现不地道(和未来的标准BOOST的不一样),一方面我对他的性能也表示不认可。当然主要是由于实现不标准,会导致我原创 2009-12-20 17:18:00 · 2594 阅读 · 2 评论 -
ACE的陷阱
ACE的陷阱坦白说,使用这个标题无非是希望能够吸引你的眼球,这篇文章的目的仅仅是为了揭示一些ACE缺陷的。文章适合的读者是对ACE(ADAPTIVE Communication Environment)有一定研究,或者正在使用ACE从事项目开发的人士参考。如果你对C++还是新手,甚至包括ACE知识初学者,(但你想飞的更高),原创 2008-09-12 03:50:00 · 26359 阅读 · 18 评论 -
总结和如何用好ACE
21 总结和如何用好ACE21.1 实践,不断尝试大学毕业生中能成为好的程序员绝对不是纯粹考试得高分死记公式拿奖学金的同学 ,而是那些熬夜写代码的狂人,哈哈。计算机是一门实践科学,你只有不断尝试才能进步。21.2 阅读的ACE代码好像是Linus(虽然他好像有点抵触C++,哈哈),好像是Linus Torvalds在回答一原创 2008-09-12 03:46:00 · 4614 阅读 · 0 评论 -
不要使用ACE_Timer_Hash
1 不要使用ACE_Timer_HashACE有一个非常优美的定时器队列模型,他提供了4种定时器Queue让大家使用:ACE_Timer_Heap,ACE_Timer_Wheel,ACE_High_Res_Timer,ACE_Timer_Hash。在《C++ Network Programming Volume 2 - Systematic Reuse wit原创 2008-09-08 23:09:00 · 2146 阅读 · 0 评论 -
Reactor定时器的精度取决于实现
4 Reactor定时器的精度取决于实现由于Reactor在各个平台的默认实现都取决于平台的实现,比如在Windows下默认的Reactor是WFMO_REACTOR,而在Linux和UNIX平台,默认的Reactor是Select_Reactor,而Reactor的实现往往取决于使用的反应器底层实现,而这些反应器的时间精度就决定了你的定时器的时间精度。下表大致反馈了原创 2008-09-08 23:11:00 · 1448 阅读 · 0 评论 -
WFMO_Reactor的与众不同
5 WFMO_Reactor的与众不同WFMO_Reactor是ACE_Reactor在Windows下的默认实现(为什么不选择ACE_Select_Reactor作为默认实现,可能是基于效率和强大性的考虑),WFMO_Reactor的低层使用的函数是WaitForMultipleObjects和WSAEventSelect,WSAEnumNetworkEve原创 2008-09-08 23:18:00 · 1456 阅读 · 0 评论 -
尽量使用ID取消ACE_Event_Handler定时器
6 尽量使用ID取消ACE_Event_Handler定时器ACE的Reactor 提供了两种方式取消定时器:virtual int cancel_timer (ACE_Event_Handler *event_handler, int dont_call_handle_close = 1);vir原创 2008-09-08 23:19:00 · 2496 阅读 · 0 评论 -
注意ACE_Pipe的实现
7 注意ACE_Pipe的实现ACE_Pipe是一个跨平台的管道实现。标准情况来讲,采用的实现,但是在最大的两个平台Windows和Linux上,ACE的实现是采用的Socket实现。intACE_Pipe::open (int buffer_size){ ACE_TRACE ("ACE_Pipe::open"); #if def原创 2008-09-08 23:21:00 · 2633 阅读 · 0 评论 -
慎用Reactor Notify机制
8 慎用Reactor Notify机制在Reactor的模式,有一种辅助的通知机制,Notify机制,简单说就是通过通知发起者调用notify函数,notify的消息被保存在一个管道中,handle_event的处理中会检查这个管道中是否有通知数据,如果有就根据通知的消息,会根据默认的通知消息的类型去调用hanle_input等函数。从设计的角度将,这原创 2008-09-08 23:23:00 · 4130 阅读 · 2 评论 -
ACE的链接Link错误
2 ACE的链接Link错误很多人在Windows使用ACE的时候往往会出现以下的Link错误。Why do I get errors while using TryEnterCriticalSection? /ace/OS.i(2384) : error C2039:TryEnterCriticalSection: is not a member of原创 2008-09-08 23:08:00 · 2277 阅读 · 1 评论 -
ACE的日志的不如意
14 ACE的日志的不如意ACE的日志部分是一个非常漂亮的实现,在多线程和多进程模型下都能较好的效率和安全使用。但是却又少量的不足,让人意犹未尽。14.1 无法替换的时间戳格式ACE日志对于时间戳的格式是固定的,采用的是格式,这个格式在西方人看起来估计还比较顺眼,在东方人眼中却不如人意。更好的方式当然是时间戳的函数可以重载。或者用函数对象(指原创 2008-09-12 03:25:00 · 1911 阅读 · 0 评论 -
自己初始化Timer_Queue的尺寸
19 自己初始化Timer_Queue的尺寸如果你的应用有大量的定时器,你最好自己控制Timer_Queue的尺寸。原因如下。默认的ACE的Timer_Queue初始化的尺寸不大,一般只有44个。而原有的尺寸不能满足你的要求的时候,Timer_Queue会自动增长,以Timer_Heap为例,增长的方式是扩大一倍空间。在性能要求严格环境下,多次增长队列的尺寸对性能会造成一定的冲原创 2008-09-12 03:38:00 · 2154 阅读 · 0 评论 -
杂项
20 杂项这一节列一些ACE使用中要注意的一些问题。20.1 ACE_Reactor的初始化应尽量提前由于为了一些自己需要的特性,我一般会自己初始化ACE_Reactor,而不是让系统默认初始化。要注意必须在程序的最开始就初始化ACE_Reactor。由于ACE的很多代码都会使用ACE_Reactor,包括日志的策略类。所以ACE_Reac原创 2008-09-12 03:41:00 · 1765 阅读 · 1 评论 -
注意cancel_wakeup等函数的返回值
1 注意cancel_wakeup等函数的返回值这是最近调试发现的一个问题,原来由于为了排查一个同事的暴力压力测试下的问题,我检查代码过程中发现原来的cancel_wakeup函数没有处理判断返回值。reactor()->cancel_wakeup(this,ACE_Event_Handler::WRITE_MASK);由于担心有什么错误处理被遗漏了原创 2010-03-27 23:00:00 · 2843 阅读 · 0 评论