难道服务端程序不能使用callback?

358 views
Skip to first unread message

kusamba

unread,
Dec 27, 2012, 8:44:47 AM12/27/12
to dev4s...@googlegroups.com
服务端程序,用callback的方式实现了一个有限状态机,用一个static变量注册函数地址,老大说不用使用函数指针,大家评论下!

他的理由是:数据越界会导致指针乱掉,从而core,有经验的同学评论下!

Kevin

unread,
Dec 27, 2012, 7:42:41 PM12/27/12
to dev4s...@googlegroups.com
哪有这个说法,nginx里面到处都是回调。如果说因为可能越界而不用,那c语言的指针、数组都得避免了。
回调确实会增加复杂度,但同时也带来高性能与灵活度等方面的好处。需要权衡。


On Thursday, December 27, 2012, kusamba <kus...@gmail.com> wrote:
> 服务端程序,用callback的方式实现了一个有限状态机,用一个static变量注册函数地址,老大说不用使用函数指针,大家评论下!
>
> 他的理由是:数据越界会导致指针乱掉,从而core,有经验的同学评论下!
>
> --
> 高性能服务器研发与运营
> http://groups.google.com/group/dev4server

Dogvane

unread,
Dec 27, 2012, 8:26:42 PM12/27/12
to dev4s...@googlegroups.com
在多人维护情况下,容易发生问题

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

egmkang.wang

unread,
Dec 27, 2012, 9:21:59 PM12/27/12
to dev4s...@googlegroups.com
弄一个闭包,如果语言不支持,就弄一个回调对象,里面保存状态.
手动的闭包.

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

qiaojie

unread,
Dec 28, 2012, 1:06:53 AM12/28/12
to dev4s...@googlegroups.com
服务器不用callback我还真不知道代码该怎么写。如果对自己的代码能力没有信心,连数组越界指针乱掉之类的基础问题都需要担心的话,那最好还是不要用C/C++了。


 
2012/12/27 kusamba <kus...@gmail.com>
服务端程序,用callback的方式实现了一个有限状态机,用一个static变量注册函数地址,老大说不用使用函数指针,大家评论下!

他的理由是:数据越界会导致指针乱掉,从而core,有经验的同学评论下!

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

龚辟愚

unread,
Dec 28, 2012, 4:18:58 AM12/28/12
to dev4s...@googlegroups.com
一般存在这个问题的可能性很低。
Malloc申请的内存是在堆上,局部变量在栈上,全局变量更是直接在数据段内的静态地址。基本不会出现你们老大所说的问题。
数据越界破坏指针的可能性一般是 数据越界覆盖了代码段而导致堆错误。这种错误一旦出现 及时你不用callback 也一样会崩溃的。

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

龚辟愚

unread,
Dec 28, 2012, 4:22:21 AM12/28/12
to dev4s...@googlegroups.com
补充一下,C++的 virtual 也是虚表实现的,一大堆的函数指针。而且没有任何保护哦。一旦出问题 整个对象系统都乱掉了。哈哈……
所以关键还是写高质量的代码,你们老大纯粹杞人忧天了。

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

张高崇

unread,
Dec 30, 2012, 2:18:35 AM12/30/12
to dev4s...@googlegroups.com
其实没这个说法, 不过c 里面用callback的机会会比较多, c++有虚函数会少一点。 但是你主管的理由也太不成立了 

在 2012年12月28日下午5:22,龚辟愚 <bywa...@gmail.com>写道:

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

熊义林

unread,
Nov 3, 2013, 9:34:14 PM11/3/13
to dev4s...@googlegroups.com
使用C++ 11的std::function 可以非常轻松和优雅地解决这个问题


--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

Chaolin Zhang

unread,
Nov 4, 2013, 2:20:26 AM11/4/13
to dev4s...@googlegroups.com
哪有这么简单,公司的编译器往往不支持,想把编译器升级到C++11不是那么容易哒(不是技术因素,而是流程/工程管理方面的问题)。


--
--
高性能服务器研发与运营
http://groups.google.com/group/dev4server
---
您收到此邮件是因为您订阅了 Google 网上论坛的“高性能服务器研发与运营邮件列表”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 dev4server+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。

robbinfam

unread,
Nov 4, 2013, 8:52:41 PM11/4/13
to dev4s...@googlegroups.com, dev4s...@googlegroups.com
很简单,用boost::function

发自我的 iPhone

pi1ot

unread,
Nov 24, 2013, 9:16:30 PM11/24/13
to dev4s...@googlegroups.com
之前用ICE看到他们有很完善的异步分派实现,至少拿来看看,可以参考一下

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

Gmail

unread,
Nov 27, 2013, 10:47:10 PM11/27/13
to dev4server
老大是对的,服务器稳定为主,用指针出问题非常非常不好排错。
 
 
 

Gmail
 
发件人: pi1ot
发送时间: 2013-11-25 10:16
收件人: dev4server
主题: Re: 难道服务端程序不能使用callback?
--

ShareIdea!

unread,
Jan 26, 2014, 5:02:44 AM1/26/14
to dev4s...@googlegroups.com
nginx,swoole 的源码里到处是函数指针。

Kevin Liang

unread,
Jan 26, 2014, 11:00:26 AM1/26/14
to dev4s...@googlegroups.com, dev4s...@googlegroups.com
就像一把双刃匕首,你可以因为它会伤人而怕它,也可以因为它能杀人而爱它。

发自我的 iPad

sunway

unread,
Dec 3, 2014, 4:32:08 AM12/3/14
to dev4s...@googlegroups.com
我见过包括我开发的网络引擎代码里面到处都是回调(虚函数)。
 
使用回调函数最重要的是对象的生存期管理要做好,否则很容易挂。
 
谨慎使用引用计数。
 

在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:

Chaolin Zhang

unread,
Dec 11, 2014, 3:14:31 AM12/11/14
to dev4s...@googlegroups.com
weak_ptr可以完美解决跨线程的弱引用问题

--
--
高性能服务器研发与运营
http://groups.google.com/group/dev4server
---
您收到此邮件是因为您订阅了Google网上论坛中的“高性能服务器研发与运营邮件列表”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到dev4server+...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--
BR,
ZHANG Chaolin

WisKey

unread,
Dec 24, 2014, 7:25:07 AM12/24/14
to dev4s...@googlegroups.com
数据越界发生的话,所有事情都不可预测啊,即使越界在不打紧的地方,谁知道某时刻获取该地址后会发生啥。
这个问题跟用不用callback没啥关联。

至于状态机,不知道你应用场景在哪,如果状态数少,switch case其实更容易编写和调试。
如果状态多,那确实需要有个state-handler的一个映射表比较方便,也就跟你想的方法差不多。


在 2012年12月27日星期四UTC+8下午9时44分47秒,kusamba写道:
Reply all
Reply to author
Forward
0 new messages