随笔(2013.8)

2013/8/8

1.session的作用:一直以为已连接套接字的句柄就可以表示一次会话了,但是在一个链接的套接字上可能存在很多次的会话,例如一个问答,如果没有session,而且双方都是异步设计的,那么可能第一个会话的请求回来第二次会话的应答。
2.对于线程的设计:要找到耗费系统处理时间的地方,能使用单线程就不要使用多线程。同样一个问题,接收网络信息、解析消息、处理消息,可以设计多个线程处理问题,每个线程负责处理这三个逻辑,但也可以这样设计,一个网络信息接收线程、一个消息解析线程、多个消息处理线程,后者可以分清业务和底层(消息解析为业务、信息接收为底层通讯),而且更加可以线程复用。(消息的解析单独出来一个线程,如果一个消息很长或者很复杂,那么如果没有单独的线程,那么解析复杂时间可能比较长,而且占用网络接收线程,那么如果网络连接任务很重,就会影响性能。)
3.把设计做好不仅是为了应变需求的变化,而且可以使得测试方便,开发并行,代码复用(代码复用在一定程度上可以应变需求变化)。看别人代码不要总看到缺点,吸取优点更重要。
4.系统框架很多回调机制(也满足框架的定义,框架三个方面,解决特定问题、半完成、回调)。
5.模块+插件,插件可以在中心动态的加载,不用重启中心即可加载,一般插件处理的多为业务,模块其实也是很多业务相关的。可以使用ACE_DLL类来加载dll。插件线程、进程选择问题。系统中的一个插件完成功能很少,而且需要进程的上下文环境,使用线程开销小,方便,缺点就是当线程挂掉可能整个中心也挂掉了,如果用进程对应插件,那么设计的时候可能一个进程对应很多的插件功能,否则对系统开销比较大。
6.服务器端有命令池,使用多个命令处理线程的主要原因是每个命令处理可能需要I/O等待、网络传输等限制系统性能的地方。如果全是CPU操作,那么单线程处理效率高。
7.在linux下使用Reactor而不是使用Preactor不仅是因为有多余的一个线程,而且可能在不支持异步的linux下,Preactor不起作用。
8.实现不要太复杂,做业务最主要还是要方便用户使用,快速开发(有时候可适当牺牲性能),代码尽可能让人看的明白,让team都看得懂。
9. 最好不要使用虚函数来提供接口,如果接口顺序调换,那么可能所有使用到这个dll的文件就要重新编译。可以使用类导出接口,提供一些导出类。让这些类的实现不改变。
10.内存不断上升肯定是有内存泄露的,delete掉就会还给操作系统。对于经常要new的对象,可以在构造函数中实现对象监视器,监视对象的个数。

11.对于内存分配,能用栈内存的最好不要用堆内存,分配速度上栈快而且不会产生内存碎片,但要注意栈内存不要太大。

12.可以增加reply接口供用户使用,一般协议Response的code为request的code加1,在reply中可以完成很多默认操作。

13.“避免向下转换”,Effective C++中的条款,说的是迫不得已使用dynamic_cast的情况,最好是用虚函数来实现。但是实际中可能遇到一种情况,类base,子类sun1和sun2,得到一个base类,我想用sun1或sun2的成员函数,就不得不强制转化过去,这种情况怎么解决?

2013/8/9

1.在VC下和linux gcc下new失败处理是不同的,VC返回NULL,linux下抛出异常,在new一些对象比较大或复杂或者经常new的时候可以使用ACE_NEW_NORETURN(p,c)这个宏,那在linux下也不会抛出异常了,用构造器c构造失败后只是简单的把指针p置为NULL。


2013/8/13

1.在同一界面内显示使用的协议,如果要找相关的协议,一般都是出现在一起的。~这也符合编程的习惯。


2013/8/23

1. linux 下new抛出异常怎么处理,是否要在经常new 的地方catch异常。一般来说,如果内存new失败,那么抛出异常也没什么意义了,全都飞了。构造函数里面最好只做一些初始化和简单的任务。

2. 函数参数中引用与指针的使用。IResponse 为回调接口,用户需要保存这个类指针,所以需要使用指针,一些不需要保存的东西,传进函数内只是简单的使用下使用引用比较方便。但是,自己比较推荐使用指针,引用检查参数困难,例如如果人家给一个指针,要使用参数为引用的函数,那么要调用fun(*p),但是这个时候即使p=null,编译器也不会告诉你,使用时候,等待的是非法访问,而指针至少可以检查是否为空。

3. OnResponse error,这个情况发生在当request构造好了,但是发送时request和Response对应关系设置好了,但是request发送失败的情况。

4. 可能出现运行正确可调试错误的情况,这个时候程序肯定是错的,可能是指针访问错误,在运行的时候指针可能有效,但是调试无效,运行时可能速度快使得指针暂时有效。

5 sscanf使用的时候一定要注意,如果是整数等要穿他们的地址,即加上&

6. bug 多个人开发程序,肯定会有影响,别人可能使用线程错误可能使整个通信底层阻塞住。

7. 易错的锁使用方法。有这样一个需求,需要知道底层的所有handler,然后对每个handler发送消息,有两种方法可以解决。
a. 锁住,一直到发送结束。这样程序简单,但是效率很低,因为发送数据过程可能很慢,如果锁住所有handler那么,其他线程就没法通信了,设计上不可取。
b. 一次性拷贝出来,然后按照拷贝的handler发送。
这样做要特别注意拷贝出来的不能是指针,如果是指针要深拷贝,一般为了方便通常把要拷贝出去的设计成值拷贝。因为在拷贝结束后取得handler发送的过程中,底层可能断开连接,如果是拷贝的指针,那么这个时候指针指向的空间可能已经不在了,在访问就会程序非法访问。

8 线程要注意完成的功能,把做耗时的功能放在线程当中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值