学之者生,用之者死——ACE历史与简评

学之者生,用之者死——ACE历史与简评

分类: c++ 27334人阅读 评论(203) 收藏 举报

学之者生,用之者死——ACE历史与简评

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

2010 March 10

ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等,重要到我们甚至觉得网络编程就应该是那样的。但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。

ACE 是一套重量级的 C++ 网络库,早期版本由 Douglas Schmidt 独自开发,后来有 40 余名学生与工作人员也贡献了大量代码。作者 Douglas Schmidt 凭借它发表了30 余篇学术论文。ACE 的一大特点是融合了 Douglas Schmidt 提出的很多面向对象网络编程的设计模式,并且具有不可思议的跨平台能力

1 ACE 历史

先说说 ACE 之父 Douglas Schmidt 的个人经历

  • 1990 年在加州大学 Irvine 分校获计算机硕士学位;
  • 1994 年在同一学校获计算机博士学位,论文《An Object-Oriented Framework for Experimenting with Alternative Process Architectures for Parallelizing Communication Subsystems》。从论文内容看,主要工作就是后来大名鼎鼎的 ACE framework,文中叫 ASX framework。
  • 1994 年博士毕业后前往华盛顿大学任助理教授,后升至副教授
  • 2003 年起在 Vanderbilt 大学任正教授至今

我相信 ACE 是 Douglas 在读博期间的主要工作,ACE 这个名字最早出现在 1993 年 12 月的一篇会议论文上,Douglas 的这篇文章获得了“最佳学生论文”奖。在此之前,Douglas 已经用 ASX 等其他名字发表了内容相近的文章。

我能下载到的最早的 ACE 版本是 4.0.32,有大约 86,000 行 C++ 代码,代码的时间戳是 1998 年 10 月 22 日。早期 ACE 由 Douglas Schmidt 个人独立开发,从 ChangeLog 得知,1993 年 11 月 ACE 的版本号是 2.12。到了 1995 年 9 月,才有第一次出现其他开发者。在 1993~1996 年间的 684 次改动中,Douglas 一个人贡献了 529 次,另外几个主要开发者以及他们的修改次数分别是 Prashant Jain (58)、Tim Harrison (42)、David Levine (28)、Irfan Pyarali (20)、Jesper S. M|ller (5)。

从整个 ChangeLog 看,从 1993 年到 2010 年 3 月有 19,000 余次改动。有超过 200 人修改过代码,其中 23 个人的 check-in 次数大于 100,排名前 12 的代码修改者为:

   3635  Johnny Willemsen (活跃年份:2001~今)

   2586  Douglas C. Schmidt(原作者,活跃年份:1993~今)

   1861  Steve Huston (活跃年份:1997~今)

   1197  David L. Levine  (活跃年份:1996~2000)

    962  Nanbor Wang  (活跃年份:1998~2003)

    907  Ossama Othman (活跃年份:1999~2005)

    865  Chad Elliott (活跃年份:2000~今)

    823  Bala Natarajan (活跃年份:1999~2004)

    708  Carlos O'Ryan (活跃年份:1997~2001)

    544  J.T. Conklin (活跃年份:2004~2008)

    479  Irfan Pyarali (活跃年份:1996~2003)

    368  Darrell Brunsch (活跃年份:1997~2001)

看到这些“活跃年份”,你的第一反应是什么?我想到的是,这些人会不会多半是 Douglas 指导的研究生?我猜他们在读研期间参与改进 ACE,把工作内容写成论文发表,然后毕业走人。或许这能解释 ACE 代码风格的多样性。

在浏览代码历史的过程中,我还发现一个很有意思的现象,在 2008 年 3 月 4 日,某人不小心把整个 ACE 的源代码树删除了:

https://svn.dre.vanderbilt.edu/viewvc/Middleware?view=revision&revision=80824

随后又很快恢复:

https://svn.dre.vanderbilt.edu/viewvc/Middleware?view=revision&revision=80826

干这件事情的老兄在 2005~2009 这几年里一共 check in 了 120 余次。你对这件事情怎么看?你们的开发团队里有这样的人吗?

2 事实与思考

1. 除了 Douglas Schmidt 和 Stephen Huston 写的三本书籍之外,没有其他专著讲 ACE。

究竟是 ACE 太好用了,以至于无需其他书来讲解,还是太难用了,讲也讲不明白?抑或根本就没人在乎?

C++ 网络编程 第1卷》《C++ 网络编程 第2卷》《ACE 程序员指南》这三本书先后于 2001、2002、2003 年出版,之后再无更新。在同一时期,同样在网络编程领域,尽管 W. Richard Stevens 在 1999 年去世,他的 UNP 和 APUE 仍然由别人续写了新版。讲 C 语言 Sockets API 的书尚且不断更新,上层封装的 C++ 居然无动于衷?真的是封装到位了,屏蔽了这些变化?

UNP 的可操作性很强,读前面几章,就能上手编写简单的网络程序,看完大半本书,网络编程基本就算入门了,能编写一般应用的网络程序。相反,读完 ACE 那几本书,对于简单的网络编程任务还是感觉无从下手,这是因为书写得不好,还是 ACE 本身不好用?

2. ACE 很难用,非常容易用错

我不止听到一个人对我说,他们在项目里尝试过 ACE,不是中途放弃,因为出了问题无法解决;就是勉强交差,并且从下一个项目起坚决不用。我听到的另一个说法是,ACE 教程的例子必须原封不动地抄下来,改一点点就会出漏子。不巧的是,ACE 的例子举来举去就是个 Logging 服务器,让人想照猫画虎也无从下手。在最近的《代码之美》一书中,Douglas Schmidt 再次拿它为例,说明他真的很喜欢这个例子。

用 ACE 编程如履薄冰,生怕在阴沟里翻船,不知道它背后玩了什么把戏。相反,用 10 来个 Sockets 系统调用就能搞定网络编程,我感觉比使用 ACE 难度要小。为什么“高级”工具反而没有低级工具顺手呢?

不好用的直接后果是少有人用,放眼望去,目前涉及网络的 C++ 开源项目里边,鲜有用 ACE 作为通信平台的(我知道的只有 Mangos)。相反,libevent 这个轻量级的 IO multiplexing 库有 memcached 这样的著名用户。

3. ACE 代码质量不高,更像是一个研究项目,而不是工业界的产品

读 ACE 现在的代码,一股学生气扑面而来,感觉像在读实习生写的代码。抛开编码风格不谈,这里举三个“硬伤”:

  • sleep < 2ms

在某些早期的 Linux 内核上,如果 select/poll 的等待时间小于 2ms,内核会采用 busy-waiting。这是极大的 CPU 资源浪费,而 ACE 似乎没有考虑避免这一点。

  • Linux TCP self-connection

Linux 的 TCP 实现有一个特殊“行为”,在某些特殊情况下会发起自连接。而 Linux 网络协议栈的维护者认为这是一个 feature,不是 bug,拒绝修复。通常网络应用程序不希望出现这种情况,我见过的好的网络库会有意识地检查并断开这种连接,然而 ACE 漠然视之。

  • timeval on 64-bit

ACE_Time_Value 类直接以 struct timeval 为成员变量,保存从 Epoch 开始的微秒数。这在 32-bit 下没问题,对象大小是 8 字节。到了 LP64 模式的 64-bit 平台,比如 Linux,对象大小变为 16 字节,这么做就不够好了。我们可以直接用 int64_t 来保存这个以微秒为单位的时间,64-bit 整数能存下上下 30 万年,足够用了。减小对象大小并不是为了节约几个字节的内存,而是方便函数参数传递。在 x86-64 上,这种 8 字节的结构体可以用 64-bit 寄存器直接传参,也就是说 pass by value 会比 pass by reference 更快。对于一般的应用程序而言,要不要这么做值得商榷。对于底层的 C++ 网络库,不加区分地使用 pass by reference 会让人怀疑作者知其然不知其所以然。

对于以上几点情况,我怀疑 ACE 根本没用在 Linux 大规模生产环境下使用过,我只能期望它在别的平台表现好一些了。ACE 的作者们似乎更注重验证新想法,然后发论文,而不是把它放到工业环境中反复锤炼,打造为靠得住的产品。(类似 Minix 与 Linux 的关系。)

4. 移植性很好,支持我知道的和不知道的很多平台

ACE 的意义在于让我们明白了C++代码可以做到可移植,并展示了这么做会付出多么巨大的代价。不细说了,读过 ACE 代码的人都明白。

从代码质量上看,ACE 做到了能在这些平台上运行,但似乎没有在哪个平台占据主导地位。有没有哪个平台的网络编程首选 ACE?

出现这一状况的原因是,跨平台和高性能是矛盾的。跨平台意味着要抽象出多个平台的共性,以最 general 的方式编写上层代码。而高性能则要求充分发挥平台的特性,剑走偏锋,用尽平台能提供的一切加速手段,哪怕与其他平台不兼容。网络编程对此尤为敏感。

我不知道 ACE 的性能如何,因为在各项性能评测榜上基本看不到它的名字(c10k 里就没有 ACE 的身影)。另外,Buffer class 的好坏直接反应了网络库对性能的追求,ACE 提供了比 std::deque 更好的输入输出 Buffer 吗?(我不是说 deque 有多好,它基本是 fail-safe 的选择而已。)

5. ACE 过于复杂,甚至比它试图封装的对象更复杂。

(这里的代码行数均为 wc 命令的粗略估计。)

ACE 5.7 自身(不含 TAO 和 CIAO)有 30 万行 C++ 代码(Douglas 自己给出的数据是 25 万行,可能指的是略早的版本),这是一个什么概念呢?我们来看 TCP/IP 协议栈本身的实现有多少行:(均不含 IPv6)

  • TCPv2 列出的 BSD4.4-Lite 完整 TCP/IP 协议栈代码有 15,000 行,其中 4,500 行 TCP 协议,800 行 UDP 协议,2,500 行 IP 协议
  • Linux 1.2.13 完整的 TCP/IP 协议栈有 2 万多行 (net/inet)
  • Linux 2.6.32.9 的 TCP/IP 协议栈有 6 万多行 (net/ipv4)
  • FreeBSD 8.0 的 TCP/IP 协议栈有 5 万多行 (sys/netinet, 不含 sctp)

换句话说,ACE 用 30 万行 C++ 代码“封装”了不到 10 万行 C 代码(且不论 C++ 代码的信息密度比 C 大),这是不是头重脚轻呢?我理解的“封装”是把复杂的东西变简单,但 ACE 好像走向了另一个方向,把不那么复杂的东西变复杂了。

这个对比数字可能不太准确,因为 ACE 还封装了很多其他东西,请看。http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/inherits.htmlhttp://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/hierarchy.html

以下两张类的继承关系图片请在新窗口打开:

http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/a06178.png

http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/a06347.png

Douglas 说 ACE 包含了 40 人年的工作量,对此我毫不怀疑。但是,网络编程真的需要这么复杂吗?TCP/IP 协议栈的实现也没这么多工作量嘛。或许只有 CORBA 这样的应用才会用到这么复杂的东西?那么为什么 ICE 在重新实现 CORBA的功能时没有基于 ACE 来写呢?是不是因为 ACE 架子拉得大,底子并不牢?

3 ACE 的意义

ACE 对于面向对象、设计模式和网络编程具有重大历史和现实意义。

ACE 诞生之时,正是 90 年代初期面向对象技术的高速发展期,ACE 一定程度上是作为面向对象技术的成功案例来宣传的。

在 1994 年前后,Unix 分为两个阵营,AT&T 的 SVR4 与 BSD 的 BSD4.x,这两家的 IO multiplexing 不完全兼容。比如 SVR4 提供 poll 调用,而 BSD 提供 select 调用。ACE 当时的宣传点之一是用面向对象技术屏蔽了两个平台的差异,提供了统一的 Reactor 接口。

【接下来,poll 在 1996 年 9 月 7 号加入 NetBSD,并随 NetBSD 1.3 于 1998 年 1 月 4 号发布。随后 FreeBSD 3.0 也支持 poll,1998 年 10 月发布。Linux 很早就支持 select,从 2.1.23 内核起支持 poll,发布日期为 1997 年 1 月 26 号。也就是说,到了 1998 年,平台差异被暂时抹平了。随后 epoll、/dev/poll、kqueue 以性能为名,再次扩大了平台差异。当然,Windows 至今不支持 poll。】

ACE 的设计似乎过于强调面向对象的灵活性,一些不该使用虚函数的地方也提供了定制点,比如 ACE_Timer_Queue 就应是个具体类,而不是允许用户 override schedule/cancel/expire 之类的具体操作。面向对象中,“继承”的目的是为了被复用,而不是去复用基类的代码。

查其文献,Reactor 在 1993 年登上《C++ Report》杂志的时候,文章标题还比较朴素,挂着“面向对象”的旗号:

  • The Reactor: An Object-Oriented Interface for Event-Driven UNIX I/O Multiplexing (Part 1 of 2)
  • The Object-Oriented Design and Implementation of the Reactor: A C++ Wrapper for UNIX I/O Multiplexing (Part 2 of 2)

转眼到了 1994 年,也就是《设计模式》成书的那一年,Douglas 开始写文章言必称 pattern:

  • Reactor 变成了 pattern,收录于《Pattern Languages of Program Design》一书(An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events)。这篇文章比前面两篇难懂,如果直接阅读的话。
  • Acceptor 是 pattern (A Design Pattern for Passively Initializing Network Services),
  • Connector 也是 pattern(A Design Pattern for Actively Initializing Network Services),
  • Proactor 还是 pattern(An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events),
  • 居然连 Thread-Specific Storage 都成了 pattern(An Object Behavioral Pattern for Accessing per-Thread State Efficiently)。
  • 还有 Non-blocking Buffered I/O,也是 pattern (An Object Behavioral Pattern for Communication Gateways)。

似乎 "pattern" 这个字样成了发文章的通行证,这股风气直到 2000 左右才刹住。之后这些论文集结出版,以《Pattern-Oriented Software Architecture》为名出了好几本书,ACE 的内容主要集中在第二卷。(请留意,原来的提法是 Object-Oriented,现在变成了 Pattern-Oriented,似乎软件开发就应该像糖果厂生产绿豆糕,用模子一个个印出来完事。)

ACE 就像一个 pattern 大观园,保守估计有 10 来种 patterns 藏身其中,形成了一套模式语言(《Applying a Pattern Language to Develop Application-level Gateways》),这还不包括 GoF 定义的一般意义下的 OO pattern。

通过 ACE 来学习网络编程,那是本末倒置,因为它教不了你任何 UNP 以外的知识。(Windows 网络编程?)

然而,如果要用面向对象的方式来搞网络编程,那么 ACE 的思想(而不是代码)是值得效仿的,毕竟它饱含了 Douglas Schmidt 等学者的心血与智慧。学得好的例子有 Apache Mina、JBoss Netty、Python Twisted、Perl POE 等等。

这就是我说“学之者生,用之者死”的含义。

4 ACE 文献导读

Douglas Schmidt 写了很多 ACE 的文章,其中不乏内容相近的作品。读他的文章,首选发表在技术杂志上的文章(比如 C++ Report),而不是发表在学术期刊或会议上的论文。前者的写作目的是教会读者技术,后者则往往是展示作者的新思路新想法,技术文章比学术论文要好读得多。

由于当时面向对象技术尚在发展,Douglas 文章里的图形很有特色,不是现在规范的 UML 图(那会儿 UML 还没定型呢),而是像变形虫一样的类图(经pinxue指出,这种图是 Grady Booch 发明的),放在一堆文献里也很容易认出来。

如果要用 ACE 的代码来验证文章的思路,我建议阅读和文章同时期的 4.0 版本代码,代码风格比较统一,代码量也不大,便于理解。

下面介绍几篇有代表性的论文。

  • 1993 年 12 月第 11 届 SUG 会议,《The ADAPTIVE Communication Environment: Object-Oriented Network Programming Components for Developing Client/Server Applications》,获得最佳学生论文奖。这是我找到的最早一篇以 ACE 为题的论文。
  • 1994 年 6 月第 12 届 SUG 会议,《The ADAPTIVE Communication Environment: An Object-Oriented Network Programming Toolkit for Developing Communication Software》,获得最佳学生论文奖。

以上两篇文章实际上内容基本相同,都是对 ACE 的概要介绍,看第二篇即可,第一次没看懂也没关系。

剩下要看的是一篇 Socket OO 封装、四篇 Reactor、三篇 Acceptor-Connector、一篇 Proactor。这些文章前面大多都给了链接,其余的这里补充一下:

  • IPC_SAP: A Family of Object-Oriented Interfaces for Local and Remote Interprocess Communication
  • The Design and Use of the ACE Reactor
  • Acceptor and Connector -- A Family of Object Creational Patterns for Initializing Communication Services  这篇论文其实可以不用看,因为它不过是把前面两篇发表在 C++ Report 上的文章合到了一起。

不想看这 10 篇论文的话,读中译本《C++ 网络编程 第1卷》《C++ 网络编程 第2卷》《ACE 程序员指南》也行,翻译质量都不错。

5 设想中的 C++ 网络库

与文章主旨无关,略。

 

我觉得网络库要解决现实的问题,满足现实的需要,而不是把 features/patterns 堆在那里等别人来用。应该先有应用,再提炼出库。而不是先造库,然后寻求应用。

查看评论
130楼 whatpc2012-05-15 22:34发表 [回复] [引用][举报]
华为的无线网管系统用的就是ACE+TAO
129楼 birdsinging2011-10-23 10:53发表 [回复] [引用][举报]
本人才疏学浅,不好说。感觉如果另提一个说法:“MFC学之者生,用之者死”,是否有异曲同工之妙呢?
128楼 qixinkui22011-10-20 15:56发表 [回复] [引用][举报]
这篇文章里,你说到:
面向对象中,“继承”的目的是为了被复用,而不是去复用基类的代码。

但你之前一篇文章里提到过:
对于继承要特别小心,这条贼船上去就下不来,除非你是继承 boost::noncopyable

把那个帖子里的问题再问一遍吧:
lanyan 写道
一晃三年过去了.不知道lz现在怎么想的
你给出答复说看这里:
http://blog.csdn.net/Solstice/article/category/793463

但是我感觉这里列出来的反而开始纠结于面向对象的细节了。不知道对于 C+Unix传统的KISS,或者说你以前提到的朴实的C++设计;你现在是怎么看的了?

看过linux之父,孟岩,庄表伟,云风 他们对oo的理性思考之后,我发现的就是你了。能继续谈谈这方面的看法吗?
127楼 haisujiang2011-09-30 11:14发表 [回复] [引用][举报]
个人认为,学习ACE需要有底层的知识(操作系统,TCP/IP网络),否则将感到非常的痛苦。
126楼 shifwang2011-08-24 16:22发表 [回复] [引用][举报]
之前没听说过,学习了.
125楼 jacklondon2011-06-10 20:16发表 [回复] [引用][举报]
我最近两年在研究 http://mina.apache.org/, 觉得比 ACE 好。
同样是用来写 NIO 服务器端程序,代码很简捷。再说, Java 代码不用考虑内存问题、条件编译问题。
124楼 srzyhead2011-05-26 13:08发表 [回复] [引用][举报]
我们的项目本来就是ace做的,后来换成自己改的一个框架了,楼主所说的有一定道理
123楼 nan12192011-04-09 13:52发表 [回复] [引用][举报]
博主,看样子很鄙视C语言,而且认为自己的C++很牛B,看你们争论就像是很多多人在争论JAVA和C++一样,不知道这样争来争去有什么意义。真正厉害的人是不会纠缠在这上面的。
122楼 stidio_zhougang2011-02-12 15:17发表 [回复] [引用][举报]
公司的一个监控项目用的ACE,效率奇差,搞得人很蛋疼;前后几个人接手,最后丢在我手上,我搞不定只想重写,但无从下手,最后用了很多奇怪的非正常方法才替换了核心的东西,现在想想都后怕,正式商用项目呀。
其实C++方面的库,还是喜欢小巧的东西。
Re: errwrsyssdtw4天前 19:18发表 [回复] [引用][举报]
回复stidio_zhougang:
121楼 kissnsms2010-12-06 19:23发表 [回复] [引用][举报]
ACE做一些简单的应用还可以,做复杂的高负载的,就不会适了。非阻塞模型封装得太差劲了,最郁闷的是还要自己去处理BUFFER,真要命。
120楼 eureka0072010-11-27 09:52发表 [回复] [引用][举报]
许继电气的变电站综合自动化软件就是用了ACE
119楼 LeoricKing2010-11-14 09:59发表 [回复] [引用][举报]
感谢楼主,感谢各位大牛,我想已经找到自己想要的东东了
118楼 linuxboy_0072010-10-30 01:34发表 [回复] [引用][举报]
关于博主说ace将一个本不是太复杂的东西搞复杂了,我不敢苟同。相反,我认为是博主看问题的角度有些许偏颇(恕在下直言)。tcp、socket api 这些东西提供的是一些基本的机制或者说比较原始的语义,而ace做的是在将这些机制进行封装从而形成更加高级的语义,ace的使用者应该根据实际需要去利用ace的对下层机制的封装才是正途。

无论如何,这篇文章给我帮助很大,感谢博主!
117楼 zy4984202010-10-13 23:13发表 [回复] [引用][举报]
这东西是拿来做做中间件的和原型开发用的。移动广州的人这样给亚信的人说:“你们倒腾代码这么久搞性能什么的,我们多买几台服务器作网关就行了。你们早点搞好我们多赚好几百万了”






想玩原生移植用libevent。改下内核长连接最多我干到2万个,帅吧。
Re: kissnsms2010-12-06 19:24发表 [回复] [引用][举报]
回复 zy498420:qq的最高计录是5W,破了这个记录再吹吧!!!
116楼 lantianye2010-09-16 22:49发表 [回复] [引用][举报]
我很多道理都明白,但就是写不出你这么牛的文章来,差在哪呢?像你前边写的多线程服务器的常用编程模型,里边说的平时真是太常用了,可是我却写不出文章来。
Re: LeoricKing2010-11-14 10:00发表 [回复] [引用][举报]
回复 lantianye:因为你抓不住主要矛盾跟次要矛盾啊。学学辩证法吧
115楼 lantianye2010-09-16 22:47发表 [回复] [引用][举报]
发现你不但是个程序员,还是个作家啊,这文章写的,话说引经据典的那些英文页面你平常也翻看并且做备注留着写文章时提供事实根据?我看过的通常就忘了找不到出处了
114楼 czylj2010-09-11 10:56发表 [回复] [引用][举报]
ACE只是学习比较困难,学不好前,全是问题.只要学到了一个阶段,其实都OK了.至于复杂度,ACE其实不仅仅是个网络库,它不是为了10多个socket api再封装设计的,有些比较并不实用.至于它的性能,稳定性,完全没有问题,个人在上面开发的基于WIN32,LINUX双平台server集群,几百W的量,10Gbps带宽使用,跑的好好的.如果你只是为了一个网络层,而看ACE,是过于复杂了,学习太困难了,如果从整体看,很不错的. 至于文档问题,都是一样的,在C++上,我用到现在只有一个STL,相对通用,别的LIB,都需要看头文件,部分甚至看实现.记住,一个错误的用法,可以把一个高效的库变成低效的.
113楼 hsc4562010-09-10 16:22发表 [回复] [引用][举报]
说得好, 曾经使用过ACE, 被折腾得够呛的,呵呵......
112楼 hzhxxx2010-09-10 12:58发表 [回复] [引用][举报]
因为我不想每天都加班搞到 12 点,嘿嘿
111楼 hzhxxx2010-09-10 12:57发表 [回复] [引用][举报]


我反正是不敢用 ACE
110楼 flyingfly2010-09-02 12:54发表 [回复] [引用][举报]
本人自认为有点发言权。我使用ACE多年,据我所知,用ACE的大公司不在少数,性能没有什么问题,这在我多年的项目中已得到验证,毋庸置疑。
ACE的学习曲线非常陡峭。但是一旦越过,你就站在巨人的肩膀上了。
楼主所评价的ACE的缺点,我个人觉得有点偏颇,你通篇都在抱怨ACE过于复杂,其实并不是复杂度的问题,是你的角度和起点有点低,建议楼主好好静下心来用一用ACE,特别是用到生产环境中,遇到问题不要先怀疑别人,先想想是不是用对了。
Windows 98的稳定性当年饱受质疑,许多人甚至说裸机不过运行超过一周。其实都是硬件、外围的驱动之类的软件没有做好导致系统不稳定。
最后补一句:本人参与过ACE开发,位于ACE名人堂之列(hall of fame)
109楼 wgm0012010-08-18 21:41发表 [回复] [引用][举报]
个人感觉ACE也没什么学习价值,linux下学习下epoll,win下学习下iocp,网络服务器编程基本上也就差不多了。
使用推荐boost.asio,不像ace那么臃肿,而且ACE的接口十分难看难用,很多还必须看源码才能了解,所以像ACE这样的库不用也罢。
我说要不是ACE出来的早才流行,现在出来的话肯定没什么人去理会。
libevent都要比它好用多了。。。
asio绝对是一流的设计,结合boost可以设计出非常精巧的网络服务器程序,剩下的就可以专注业务处理就行了。
108楼 galaxy6662010-08-02 11:08发表 [回复] [引用][举报]
楼主有ACE4.0的源代码或者链接吗?

谢谢

我邮箱是:[email protected]
107楼 panda772182010-07-29 17:11发表 [回复] [引用][举报]
各种语言有啥本质区别么?无非写的人思路不一样而已,习惯不一样而已
106楼 webh2010-07-10 17:29发表 [回复] [引用][举报]
5年前花了两个月跟踪ACE源码,基本掌握ACE的几个常用模式,4年前用ACE_TP_Reactor搭建了一个多客户对多服务器的多线程数据交换中心,只用了400~500行程序,感觉很爽,不像楼主说的那样。 不过对于楼主的论述还是表示感谢,很深入,百花齐放。
105楼 匿名用户2010-05-30 12:06发表 [回复] [引用][举报]
偶现在就在研究和使用ACE,用于我们的项目上,比如ACE的读写锁,Guard机制,Reactor机制等,我们都在用,项目也运行的很稳定,性能也不错。
104楼 im9241061792010-05-05 12:31发表 [回复] [引用][举报]
回复同过同过
103楼 whutxinriyue2010-05-04 20:54发表 [回复] [引用][举报]
呵呵!学习了
102楼 tjliupeng2010-04-30 00:43发表 [回复] [引用][举报]
我还是挺赞同LZ的一个观点,就是太庞大,为了跨平台,封装了很多东西,可能在某些场合是杀鸡用宰牛刀。
从学习的角度来看,学习ACE的设计思想和模式还是很有帮助的。Douglas C. Schmidt在ACE的发展过程中编著了Pattern oriented software architecture的5卷书,这5本书还是包含了作者的很多观点和思路,可惜偶还没有时间看。
101楼 tjliupeng2010-04-29 18:24发表 [回复] [引用][举报]
真是公说公有理,婆说婆有理。我们现在也在用ACE,一个服务器通过ACE来接收上千台设备传输的数据,我当初提议我们这个项目用ACE也只是考虑到跨平台的问题,我们在Windows和Linux Vxworks上都需要用。由于目前只是在开发阶段,能充分感受到的就是跨平台的好处,我们组成员写的代码在我上面所说的几个OS上都跑起来了,性能我们还没有测试, 。
我个人觉得通信服务器如果只在一个平台上跑,而且没有特别的要求的话,最好还是不要用。看过其源代码,还真是复杂,编译条件可选的也非常多。
100楼 wufaqiang2010-04-22 11:49发表 [回复] [引用][举报]
08年曾经用ACE类库写了一个简单的FTP server当做计算机网络这门课的作业,那时候真是痛苦啊,看了楼主的文章以及各位的评论,感觉自己还真是应该把这个东西重新好好看一下,受教了!
99楼 tohjs2010-04-21 12:50发表 [回复] [引用][举报]
写得很好!用ice吧。
98楼 匿名用户2010-04-16 10:17发表 [回复] [引用][举报]
我之前看到有人列举有哪些公司在用ACE的回帖怎么没了?删了?
97楼 匿名用户2010-04-12 11:10发表 [回复] [引用][举报]
05年编译了一次ace,花了3个小时。放弃学习这个库了
96楼 freezezdj2010-04-10 11:53发表 [回复] [引用][举报]
评论不错!
好好看看!
95楼 匿名用户2010-04-04 19:20发表 [回复] [引用][举报]
ace对应用c++来开发是很具有学习价值的。在hw的多年,时时刻刻都在和ace打交道,它的设计思想、模式、观念都是值得学习。对ace的评论还是在有了一定了解后在做评价为好。
Re: wyjkk2010-04-08 01:10发表 [回复] [引用][举报]
回复 匿名用户:支持:“对ace的评论还是在有了一定了解后在做评价为好”
94楼 匿名用户2010-03-26 11:32发表 [回复] [引用][举报]
ACE技术很好,但风水不好!

用的企业,只要公布的,都基本离死不远,或者入土了。

那些偷偷用的,好像活的的不错,比如HW,TX者流。

结论:楼主学之者生,用之者死,精辟!!!

补充结论:要用开源的东西,还是偷偷的搞,不要到处张扬。
Re: daotong2011-11-22 22:17发表 [回复] [引用][举报]
引用“birdsinging”的评论:本人才疏学浅,不好说。感觉如果另提一个说法:“MFC学之者生,用之者死”,是否有异曲同工之妙呢?
我怎么感觉反过来呢,MFC是“学之则死,用之则生”,MFC的设计并不好,但作为一套成熟的工业级类库,还是能让人放心的。尤其是windows下的界面开发,更是离不开。
93楼 匿名用户2010-03-26 11:29发表 [回复] [引用][举报]
Veritas 的网络存储管理软件用的是ACE库,一直搞小型机维护,对编程知道不多,不过用之者死倒是真的,Veritas已经死了。不过这个公司的netbackup软件,集群备份软件,真是不错的软件....

真是可惜了。
92楼 lg2theside2010-03-25 10:11发表 [回复] [引用][举报]
如果你在一个网络项目中,独立用c++开发 过 5万 行,再回顾看看ace 吧
简单的api调用是不能满足 复杂 并发 的网络的,如果要稳定 还是需要很多策略来保护的, 呵呵
91楼 wuzeng20022010-03-24 13:29发表 [回复] [引用][举报]
ACE的确不行 就易用性来说 只有学术价值 没有实用价值
90楼 匿名用户2010-03-24 04:21发表 [回复] [引用][举报]
好文,一直困惑于少见到用之者的声音;
能引出如此多评论的文章,从这个方面来说是绝对的好文!
89楼 匿名用户2010-03-22 16:46发表 [回复] [引用][举报]
建议楼主先去研究Mangos再说!
88楼 匿名用户2010-03-22 13:58发表 [回复] [引用][举报]
其实,ACE并不是一个十分容易使用的"黑盒"库,你在使用它之前,一定要仔细了解它的实现机制,依NP1,NP2的例子照猫画虎那是必死无疑的,ACE的强大在于它提供了两种网络编程的框架reactor,proactor。把这两个框架的实现机制搞清楚了,使用ACE就会得心应手了。boost的asio就是仿照proactor搞的,区别只不过是使用模板实现而已。
87楼 xiao_zhong_wei_85122010-03-22 13:01发表 [回复] [引用][举报]
楼主说的有道理啊
86楼 zhangning2010-03-22 11:58发表 [回复] [引用][举报]
楼主说的好,就是我使用 ace的体会
就用了一个项目,就不敢再用了。。。。
85楼 匿名用户2010-03-22 11:40发表 [回复] [引用][举报]
陈文一开始就说ACE没有用户,(后又有好事者改口说是没有小用户)。真为难人,真是聪明人,让我们写文讨论的过路人,上哪去收集小用户的信息?真要收集到了,估计人家又改口说,ACE没有长得比较帅的用户,所以是用之者死 。====说正事。陈文第1节,谈了《ACE 历史》。这一小节很能看出陈先生考据之用功,当然也很能吸引读者,我也看得津津有味(并且成功地吸引了我往下继续看),不管你有用过或没用过ACE,IT中人总爱看一些这一行的逸事野史。再次感谢陈先生。==== 有句话说是:“历史是什么?历史是一个任人打扮的小姑娘。”,这是指同样一段历史,但讲述的人目的不同,就会把历史各说一套,所谓“六经注我”说的正是这种讨厌的事。但陈先生在此方面显示了一个技术人员应用的品质,他没有为了证明自己的“ACE 学之者生,用之者死” 而有意无意地在描述ACE的某些历史里“加注”某种暗示-----至少我是看不出这段历史能说明用ACE的项目(或软件)会死。

这一段的评论就到此了。再次感觉陈先生挖掘了ACE一些有趣的往事。
84楼 xshsoft2010-03-21 19:36发表 [回复] [引用][举报]
框架做得越万能,就越复杂,越复杂越难用.具体应用具体设计.这些工具而已,俗话说杀鸡不用牛刀,什么样的应用,用什么样的工具.
83楼 匿名用户2010-03-21 14:23发表 [回复] [引用][举报]
LZ只看到了其一,它本身就不是一个经过严格测试的工业库
但它其中的设计模式和模板的确在这个世界还找不到匹敌的
ACE其实真的精粹在于提供了一个松散的框架,其组件可以自由替换
82楼 匿名用户2010-03-20 23:33发表 [回复] [引用][举报]
哈哈,研究生的毕业论文也是折腾这个玩意的,小项目也用来做过一两个。当时国内还比较少人研究ACE,导师让我去给师弟讲讲,讲了一大堆,如何如何好,但到最后还是凭良心自我否定了一下,得出了与楼主差不多的结论。
81楼 justyan2010-03-20 18:34发表 [回复] [引用][举报]

看了还是很受启发的,不管怎么说,要能很好的解决现实应用问题才能有人用。
80楼 匿名用户2010-03-19 15:25发表 [回复] [引用][举报]
CSDN好为人师者众啊。一个事物能够存在并发展这么多年,必定是有其特别之处的。以本人经历来说,工作中有过三次体验。前两次均以失败告终,因为那只是把NP1,NP2的例子按照自己的理解来用,至于它内部的实现机制如何并未深究。之前有位说文件传输效率巨差的我看到那也笑了下,当时确实没办法,只好用socket api重写了事。但庆幸的还好没有放弃对ACE的钻研,第三次使用时也具备了设计模式的知识,基于ACE的项目还是比较成功的。系统运行至今良好,没有出过错,不知道这能不能算为成功?第三次使用时其实很简单,只是把第一、二次实践中写出来的代码删除了三分之二,把剩下的三分之一重新排列组合了一下而已。但我不知道我的情形是要归之于学之还是用之呢。我还是希望第一次尝试就放弃的同仁们能再坚持一下吧。
79楼 匿名用户2010-03-19 10:54发表 [回复] [引用][举报]
不知道楼主用ACE写过多少大型的(特别是跨平台下的)项目,
没有深刻的经验体会就别只关注事物的缺点。任何东西,只有深入了解并实践过、思考过才明白它的原理,不能为表面的东西所蒙盖。这好像又回到了讨论:C&&C++哪个好一样,毫无争辩的意义。
78楼 deping_chen2010-03-19 10:29发表 [回复] [引用][举报]
第一次听说ACE网络通信库,百度了一下才知道全称。
我一直使用socket和WinInet API的。
77楼 匿名用户2010-03-19 09:44发表 [回复] [引用][举报]
一句话: ACE 不合符 KISS原则
76楼 匿名用户2010-03-19 08:59发表 [回复] [引用][举报]
不管是框架、平台、语言,只要是复杂、难用只有死路一条。Multics,OS/2, EJB,CORBA, ACE, X.400都是尸体
75楼 匿名用户2010-03-18 18:24发表 [回复] [引用][举报]
用过3-5年ACE的飘过,对于楼主的牛气,我只能说大哥你太高了,高到我都看不见了,ACE的确有很多不尽如人意的地方,比如学习曲线比较陡峭,代码里面有不尽如人意的地方,但是仅仅因为存在缺点就全盘否定我只能说你也就是个盲人摸象的主,不如楼主来开发出一套取代ACE的网络库吧,不要在这里喷口水了,那将是开发人员的一大幸事
Re: docong2010-11-10 23:27发表 [回复] [引用][举报]
回复 匿名用户:楼主本来就开发了一套,放在google code上的 。
74楼 wanshi1312010-03-18 15:57发表 [回复] [引用][举报]
ACE确实有很多东西值得学习,至少也算是久经考验的。至于是不是“用之者死”,这要看谁用。我就看了一个月,就在我们的服务器上用了ACE,现在运行的很好。
73楼 匿名用户2010-03-18 12:48发表 [回复] [引用][举报]
ace用的多,是因为出来的早
72楼 匿名用户2010-03-18 12:47发表 [回复] [引用][举报]
为什么有些人都不喜欢c++的模版,虽然刚看始看有点头疼,看多了就会发现模版有着如此优雅的抽象能力。

ace我是没用过,但asio的设计我感觉无人能出其右。
Re: wuzeng20022010-03-19 12:58发表 [回复] [引用][举报]
回复 匿名用户:我很喜欢用 特别是让父类提前预知子类的某些属性
71楼 my8603102010-03-17 16:56发表 [回复] [引用][举报]
这么长。。。
70楼 匿名用户2010-03-17 16:21发表 [回复] [引用][举报]
回复 匿名用户:
很显然你列出的都是写大型公司,不就证明了学之者生,用之者死的道理吗,其他我不敢说,华为和腾讯都有用ACE,但是都是些多年网络编程经验的人修改或者精简了在用,正符合学之者生。
Re: 匿名用户2010-03-18 08:01发表 [回复] [引用][举报]
回复 匿名用户:
通常吧,人们在为自己产品列“成功案例/Success Stories”时,都会尽量列一些大企业,除非这个产品真的就只有小用户。但今天我才知,原来列一些大型公司在使用,居然也就证明了自己这个产品将是“用之者死”。

还好吧,ACE的用户列表上,还有诸如“Big Science ”啊“财务软件”啊,“游戏”啊。。虽然有名的公司还是不少,但无名小卒(或者我辈没听过的外国公司)也不少……有兴趣自己去看看。

=======

小结一点,列出用户清单 ,不过是一件人人可为的小事。本就不为了证明ACE是用之者生还是用之者死。 陈先生文章开篇不久就提出“但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。”。可见此雄文的根基在于那个“为什么”,否则他可能 也就没有“本文”,自然也就会不会“谈谈”“个人观点”。

=======
再往后的交流中,有人提到: “ACE在工业界还是得到比较多应用的,特别是外企,而且作为底层中间件用了很多年也比较稳定,更不大可能会被替换,因为成本太大。而要用好它确实需要对其设计思想和实现有全面深刻的理解,懂得扬长避短。不然一些小陷阱会让人很郁闷。" 陈先生基于ACE必然使用者寥寥的观点,也就直接了:

Solstice博客专家 发表于2010年3月14日 23:22:07
回复 AccKernel:请问你知道有哪些外企在用?
69楼 sheismylife2010-03-17 14:30发表 [回复] [引用][举报]
回复 匿名用户:
68楼 Solstice2010-03-17 12:41发表 [回复] [引用][举报]
回复 songbohr:我说我不懂 C 语言,这不是谦虚。我 2001 年以后没有写过 C 代码。一个将近 10 年没有写 C 程序的人,怎么敢大言不惭称“懂”呢?C 语言的库和源代码我最近倒是读了很多,这没什么难的。我的日常工作就是写 C++ 和其他语言的代码,C++ 我还是懂的。一个活儿派过来,我能用 C++ 很快做完;而如果你只允许我用 C,那我交不了差,这就是我说“不懂 C”的含义。
67楼 klain__qin2010-03-17 10:37发表 [回复] [引用][举报]
很经典:学之者与用之者!
66楼 匿名用户2010-03-17 10:35发表 [回复] [引用][举报]
65楼 sheismylife2010-03-17 09:30发表 [回复] [引用][举报]
我把ACE等成c++世界的jdk来用。再加上boost和标准c++以及其他的开源库,基本上就可以做到跨平台c++编程了。想想吧,这样多好阿。起码比java性能快多了。如果水平足够高,时间也足够,就算这些库有什么缺点,总有办法去解决的。
楼主评说ACE的优缺点,但是也不能直接下结论这个东西不行,用了就死。实在不行,你就拿代码去借鉴,改成自己的东西。ACE不限制你任何行为。
64楼 jlugjb2010-03-17 09:07发表 [回复] [引用][举报]
做学问要严谨,楼主有哗众取宠之意。
63楼 匿名用户2010-03-17 02:13发表 [回复] [引用][举报]
博主说的有一定道理
ACE这种库。还是不适合作网络程序。
ASIO在性能上是很棒的。有些小缺陷。自己改改就是了。本来代码也没多少。
很多人之所以推崇,是因为学了很久。又舍不得放弃。又怕被人说蠢。呵呵。
62楼 匿名用户2010-03-16 22:36发表 [回复] [引用][举报]
ACE那些封装过后的类确实没有为我带来多少好处,所谓强调面向对象的网络编程技术,实际上是一种过分强调面向对象技术的观点
Re: lht198311082010-03-19 23:24发表 [回复] [引用][举报]
回复 匿名用户:高人带的
61楼 missdeer2010-03-16 19:20发表 [回复] [引用][举报]
回复 匿名用户:确实说错了,是直接使用socket API,不是原始socket
60楼 gunsand2010-03-16 18:54发表 [回复] [引用][举报]
BOOST中文文档太少,也不建议新手使用,还不如用ACE。
59楼 gunsand2010-03-16 18:53发表 [回复] [引用][举报]
用ACE做太复杂的东西 就是找死
建议直接用ACE成熟的模型。
至少做服务器 做网络程序 还是简单的。
58楼 匿名用户2010-03-16 17:32发表 [回复] [引用][举报]
我个人觉得C++的库就很怪,一个C++ STL,那个代码我就看不出来有好清楚!一点就没有C++的规范,感觉大量使用模板库的代码杂乱无章,虽然STL是一个非常好的定西,但是试图深究- - 痛不欲生。
57楼 sis6202010-03-16 15:22发表 [回复] [引用][举报]
我只是来看评论的
56楼 FireEmissary2010-03-16 13:19发表 [回复] [引用][举报]
boost::asio如果是头文件only可以考虑,然而它不是.所以它不仅代码理解上比ace晦涩.用起来也方便不到哪去.

ace的主要弱点我认为在于编译依赖没搞好.
os包装层,socket 封装层,模式层(如Reactor ,Proactor ),框架层
起码可以分开了链接编译才好.目前铁板一块.
55楼 QiuTianGuiQu2010-03-16 09:16发表 [回复] [引用][举报]
54楼 wl5orange2010-03-15 23:52发表 [回复] [引用][举报]
53楼 wl5orange2010-03-15 23:52发表 [回复] [引用][举报]
52楼 AccKernel2010-03-14 22:46发表 [回复] [引用][举报]
ACE在工业界还是得到比较多应用的,特别是外企,而且作为底层中间件用了很多年也比较稳定,更不大可能会被替换,因为成本太大。而要用好它确实需要对其设计思想和实现有全面深刻的理解,懂得扬长避短。不然一些小陷阱会让人很郁闷。
Re: Solstice2010-03-14 23:22发表 [回复] [引用][举报]
回复 AccKernel:请问你知道有哪些外企在用?
51楼 xifengmuye2010-03-14 13:49发表 [回复] [引用][举报]
不是搞软件的,来看看。了解一下
50楼 bihe08322010-03-14 11:37发表 [回复] [引用][举报]
牛X……
49楼 匿名用户2010-03-14 11:02发表 [回复] [引用][举报]
1. As per ACE is an upper layer lib, its performance can not compet with native lib. It has its own thread implements to map native OS lib.
2. It also wraps many concurrency structures such as lock, semphore etc. to get it cross over platforms.
3. Another advantage of ACE is that it is a real-time networking lib. What is real-time? it means latency is not longer then some value in the worst case. ACE rewrote a real time memory lib.
Re: 匿名用户2010-03-14 13:54发表 [回复] [引用][举报]
回复 匿名用户:
看不懂你想说啥,你能看中文就写中文吧。
什么时实时?实时就是延迟更低吗?别开微笑了。你先了解了解wxworks, QNX这样的操作系统再来显摆英语吧。
48楼 匿名用户2010-03-14 10:49发表 [回复] [引用][举报]
在我眼里,都只是学习对象而已...
47楼 jacklondon2010-03-13 21:19发表 [回复] [引用][举报]
ACE 出现的意义,是因为 C/C++ 在网络(socket)编程方面,不能跨平台。
现在 Java /.net 都已经解决了这方面的问题。ACE 还有存在的价值么?
至于性能,大多数应用,都不太在意。程序没有写好,硬件升级呗,硬件多便宜啊!!这是现在软件编程的趋势:强调开发效率,不强调性能优化。
而且,C/C++ 很多技术,都是很有争议的,必须虚函数,很多 C++ 程序员都因为会降低性能而反对,但是现在 Java /.net 默认基类所有函数都是虚的(也就是可以 overwrite 、可以多态的)。ACE 用虚函数也导致一些 C/C++ 程序员的抵制。
时代不同了!!
Re: jacklondon2010-03-13 21:20发表 [回复] [引用][举报]
回复 jacklondon:
而且,C/C++ 很多技术,都是很有争议的,必须虚函数,很多 C++ 程序员都因为会降低性能而反对==》"必须" 应为"比如"。
Re: docong2010-11-10 22:58发表 [回复] [引用][举报]
回复 jacklondon:每次看到个什么人,连狗屁系统都没写过,连狗屁论文都没发过,都敢言必称“趋势”,我都想骂这帮孙子,你丫就只配当个天朝人。
46楼 匿名用户2010-03-13 14:01发表 [回复] [引用][举报]
ACE是网络编程中经验的积累,如果有比较丰富的经验,那些模式自己也可以总结出来,但是如果经验不够,这些模式是看不明白也用不好的,然而真正有了水平的人也是不屑用ACE这样既庞大有复杂的库的,所以博主说学之者生,用之者死我是非常赞同的,自身水平不怎么样还想驾驭庞大的系统,不死还能怎么样?
45楼 raocong20102010-03-13 11:44发表 [回复] [引用][举报]
网络编程……
44楼 匿名用户2010-03-12 23:17发表 [回复] [引用][举报]
在很多公司,还有很多项目,有一种叫基础库的东东,我看到很多公司用一些“牛人”所谓的基础库,然后人走了,也没人维护了。
也有很多公司用一些市面上的所谓的“强大的网络库”,但用着用着,发现需要某种功能的时候却没有。

在我看来,ace是当前c++功能最强大的库,各方面的控制也还说得过去,(也有人认为是asio,我觉得仁者见仁)。

选用其他的库经常会碰到一些维护的人少,开发的人水平本来就不怎么样这些事情(c++轮子很多,我以前刚毕业的时候也不自量力想搞一套很强大的网络库,后来觉得自己天资不行)

ace是一个开源方案的拆中选择,强大而复杂,虽然楼主认为用的人少(但其他的用的人其实更少),社区用户和开发者比较活跃。而且也有专门的公司做支持。相对风险略为可控(就是说最多就是钱的问题)

批评容易建设难,一个东东很容易看到他的缺点,但要用东东来替代,有时候还真难。
43楼 匿名用户2010-03-12 23:04发表 [回复] [引用][举报]
在我看来,批评一样东东是很容易的,建设是困难的,但做为使用者来说有批评的权利,在这点上面我支持楼主。

最难的是客观评价一样东东。
42楼 匿名用户2010-03-12 22:56发表 [回复] [引用][举报]
楼主你提了这么多,其实绝大部分都是一些细枝末节,只有一个问题:太复杂!!!洋洋酒洒写了这么多,我建议把大部分的都删 掉得了。任何一个库,特别比较大的,一些小的细节不可能处理得都非常好。
41楼 匿名用户2010-03-12 22:54发表 [回复] [引用][举报]
对于模式这个东东,仁者见仁,智者见智。
楼主也许对ace这种到处讲模式的比较嘲笑,也许的确有的过分细了,但总体上来说有没有意义?
楼主自己也提到了其实有很多框架也是学习ace的,为什么抓住一些小小的问题再来放大问题呢?

楼主也许是那种完美主义者,什么都要100%,那不太可能。


最后简单概括一句话,关于ace的缺点,其实就是那么一句:太复杂了。
40楼 匿名用户2010-03-12 22:50发表 [回复] [引用][举报]
在我看来,楼主其实就是接触ace时间未必太长,被一堆的类搞晕了的人,由此产生的挫折和抱怨,其实学习很多c++库都有这样的感觉。

做为一个类库来说,ace的书已经够多了。
楼主虽然讲socket api的书每年都有,但其实都大同小异,在我看来,unp就差不多了,最多再加本windows下的网络编程,再高级的就是看操作系统了。

不巧的是,ACE 的例子举来举去就是个 Logging 服务器,让人想照猫画虎也无从下手。

//=============================
请打开example,test目录,或者再加上那个jaws也行。
不足之处就是有时候这些例子也不是那么容易理解的。
我倒建议看ACE_wrappers/examples/APG/Reactor下面的例子。很多例子加上注释也没有400行,
39楼 匿名用户2010-03-12 22:44发表 [回复] [引用][举报]
其实我也觉得ace太复杂,主要也是因为
1、ace想做的事情太多,没有分成子工程。
2、c++本来就复杂,
3、ace其实只是底中层,对上层的支持不够,再增加些protocol和handler类就最好了,那样只要提供protocol,handler,server的实例就行了。

如果可能的话,宁可去用java,c#.
除非效率非常重要,以前某些地方的控制非常重要,才会考虑用c++
38楼 匿名用户2010-03-12 22:41发表 [回复] [引用][举报]
那么为什么 ICE 在重新实现 CORBA 的时候没有基于 ACE 呢?是不是因为 ACE 架子拉得大,底子并不牢?

这个似乎根本没有逻辑性可言,请不要随意猜测,我没有用mina并不是因为他不牢,我没有用linux也并不是因为他内核不稳定,这些没有明显的关系。
ace只是一种选择而已。
Re: FocusOnACE2010-03-12 23:55发表 [回复] [引用][举报]
回复 匿名用户:
说出“ICE重新实现CORBA..."这样的话就说明即没用过ICE,也没用过CORBA 了。
37楼 匿名用户2010-03-12 22:39发表 [回复] [引用][举报]
另外,Buffer class 的好坏直接反应了网络库对性能的追求,ACE 提供了比 std::deque<uint8_t> 更好的输入输出 Buffer 吗?(我不是说 deque 有多好,它基本是 fail-safe 的选择而已。)

ace没有提供,直接用char buffer[MAX_INPUT_SIZE]是效率最高的做法。
ace提供的是message_block,要想高效,可以用lookside提前分配。
36楼 匿名用户2010-03-12 22:37发表 [回复] [引用][举报]
对于以上几点情况,我怀疑 ACE 根本没用在 Linux 大规模生产环境下使用过,

这点楼主请不用怀疑,在某公司做connection server,连5万个tcp没问题。
35楼 匿名用户2010-03-12 22:34发表 [回复] [引用][举报]
简单看了一下,原来作者想说的就是这么几个:
1、复杂
2、有这三个“硬伤”
* sleep < 2ms

在某些早期的 Linux 内核上,如果 select/poll 的等待时间小于 2ms,内核会采用 busy-waiting。这是极大的 CPU 资源浪费,而 ACE 似乎没有考虑避免这一点。

* Linux TCP self-connection

Linux 的 TCP 实现有一个特殊“行为”,在某些特殊情况下会发起自连接。而 Linux 网络协议栈的维护者认为这是一个 feature,不是 bug,拒绝修复。通常网络应用程序不希望出现这种情况,我见过的好的网络库会有意识地检查并断开这种连接,然而 ACE 漠然视之。

* timeval on 64-bit
3、对性能表示怀疑(但似乎也没有测过)
不知道我理解得对不对。
34楼 Solstice2010-03-12 20:54发表 [回复] [引用][举报]
回复 匿名用户:CSDN 这个是主博,博客园那个用于全文 RSS 输出,cppblog 只发 C++ 相关内容。
33楼 匿名用户2010-03-12 19:23发表 [回复] [引用][举报]
32楼 songbohr2010-03-12 14:22发表 [回复] [引用][举报]
开源地址https://code.google.com/p/ioframe/,可通过svn checkout

或通过https://code.google.com/p/ioframe/source/browse/#svn/trunk查看
31楼 songbohr2010-03-12 14:12发表 [回复] [引用][举报]
我按照你心中的网络库提交了一份

设想中的 C++ 网络库开源代码https://code.google.com/p/ioframe/

基本符合你心中的模型,希望陈硕大牛指正,也希望有兴趣的人参与到这个项目中来。
Re: Solstice2010-03-12 20:24发表 [回复] [引用][举报]
回复 songbohr:C 语言的?不是我想要的。
Re: assiwe2010-03-19 11:29发表 [回复] [引用][举报]
回复 songbohr:会用c++不会用c....太有才了

你可能感兴趣的:(网络编程,中间件,框架,架构)