多线程程序杂记

     最近又完成一个C++服务器项目的开发,使用了多线程,在测试过程中遇到一些问题,记录一下,以供以后查看。

     1 内存泄露

        由于采用了缓冲的机制,而且操作的是大块数据,因此用的new比较多。在做压力测试的时候经常把内存耗光,导致死机。

        当确认存在内存泄露的时候,首先要先把代码检查了一遍,查找所有的new和delete操作是否配对使用了。检查代码可以从设计层面上纠正一些问题,但对于编程过程中的疏忽或设计中遗露的细节就可能错过,尤其对于那些变化中的代码,一不小心就会忘记释放一些资源。其次可以借助一些工具来检查内存泄露,在此推荐一下valgrind,特别易用,内存泄露报告特别清晰,告诉哪个指针在代码的什么地方没有释放。

     2 程序崩溃

     当你仔细处理指针时,崩溃经常是由于设计多线程程序时考虑不周造成的。由于未正确实施同步,导致竞态条件的存在,程序可能会偶发性出现问题,小到结果出错,大到崩溃。处理两个线程的竞争是容易的,如果设计方案是多于两个线程从不同分支访问了共享数据,则有时候可能不太容易意识到同步的必要性,此时就会出现问题。

      程序在测试时出现了崩溃,而且报告pure virtual method called terminate called without an active exception,从网上搜索了一下,前人说这个问题是因为我们析构一个还在使用中的对象,这个绝对是多线程未能正确同步造成的,一个线程还在使用一个对象,而别一个线程开始清理这个对象。多数情况下,程序崩溃只有一个段错误的提示,不会给出上面这个提示,因此调试也比较困难。

     从我的使用经验来看,目前面向对象的设计还不是特别方便的融入多线程设计,在设计面向对象的多线程程序时,需要仔细考虑以保证访问对象的线程安全性,并避免死锁,期望有一种新的语言能特别方便的实现并发处理并不用考虑锁的存在。openMP及erlang应该是不错的选择,只是还有些小众,适用性也不是特别广泛。

     3 软件设计与实现鸿沟

     设计是高层结构,在从设计向代码的转换过程中,细节是魔鬼。

你可能感兴趣的:(多线程,exception,erlang,服务器,测试,delete)