工程需要一个使用udp的程序,通信部分循环接收数据包,当接收到数据包后,开启一个线程将接收到的数据插入数据库中。该子线程向数据库插入完后就自动关闭数据库连接,并释放资源,最后使用exitthread函数关闭线程。问题是:我查程序暂用资源,发现该程序占用内存一直在升高并且数据库占用内存也在升高,这应该是数据没有释放连接或关闭资源的问题,但是我在处理时确实关闭连接并释放资源,请问各位高手这是怎么回事?
while(1)
{
    recv();//接收数据包
   createthread(insertdb).//创建线程向数据库插入接收的数据包
}
insertdb()
{
  CoInitialize(NULL);
  _ConnectionPtr pConn(__uuidof(Connection));
  pConn->Open();
  pConn->Execute();//执行插入操作
  pConn->Close();//关闭连接
 pConn.Release();//释放连接
 CoUninitialize();

解决方案 »

  1.   

    ExitThread的方式不是很好,是所在线程内的一定程度上的强行退出。建议你用return 0 就够了。
    另外。pConn.Release()建议不要使用,智能指针类可以自己释放。不需要显示释放,当然前提是使用正常的return退出1。内存占用,数据库操作是会增加内存占用,因为ADO会使用链接池内部管理,所以会增长到一定的时候,就不会再有明显的增长
    2。如果是持续增长,有可能是产生的写数据库线程太多,而之前的线程没有处理完,所以要看是否会有线程数量的高低波动。
    3。建议你设置产生线程最高数量,不然内存不好控制确定,线程进入的时候,计数器加一,线程退出的时候,可以把计数器减一。注意临界区保护计数器
    4。也可以事先生成若干数量的线程。而不是频繁创建线程。在线程内部Wait事件。而在recv线程SetEvent,这样就能省不少资源。注意要使用自动重置的事件对象
      

  2.   

    和我遇到的问题一样,我也是使用ADO的, 我测试过1000 1500多个线程. 但是结果不理想.
    内存就是不释放. 不过确实是后面涨的不厉害,但是问题在于它最后不会退回开始的内存使用量