服务器程序开发中的思维转换和注意要点
在日常的服务器程序开发中,我也经历过很多挫折和错误,慢慢的总结出了一些经验和教训,在这里和大家分享和讨论。1、注意思维问题,不要像开发客户端程序一样的模式思考服务器的处理模式。
在写相关的处理的时候,随时要想着,这段代码可能会被大量用户并发调用,是否会引起同步访问、唯一标识错误等问题。我就犯过一次大错,在标识客户端ID和处理序列的时候,居然只记录了处理序列号,而这个序列号很可能重复,导致一个重大错误。
2、注意同步中的问题。
绝大多数服务器软件不可避免的会使用多线程的机制,这就引入了一个同步的问题。相信大多数能做服务器端程序的,对线程的同步都很了解,但是这未必不会犯错。同步带来两个问题,第一个就是性能下降,如果能够消除不必要的同步,分离数据,就能有效的消除性能瓶颈。第二个更可怕,死锁。ACE_GUARD系列宏,在你不经意的时候,经常给你带来问题,如果这个宏同时和delete this使用,大多数都会崩溃。而死锁,更是难以调试,让人头大。发生死锁,需要你仔细的分析代码处理的流程和可能发生死锁的位置。这里介绍一个经验,如果你怀疑自己的程序发生死锁,你可以使用Process Explorer,(www.sysinternals.com,被微软买了),安装调试符号,打开你需要检查的程序,查看线程堆栈,就能看到各个线程大概在做什么,是否有同步的acquire()等调用,如果程序不在处理数据,而线程都在acquire(),很可能死锁了。
分析死锁发生的位置和原因,需要操作系统的相关知识,明白死锁的理论。具体处理呢,就是在代码中寻找“环”,寻找环路的处理依赖。比如A通过B调用了C,而C在不同的线程,又调用了A,A、B、C中的代码,都有同步处理过程,这个就容易发生死锁,想办法打破这种循环依赖关系,不仅仅对减少代码耦合重要,更对服务器的死锁预防重要。
页:
[1]