尝试用过createthread创建线程调用函数的做法,
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)HandleConnect,(LPVOID)ClientSock,0,&dwThread);
HandleConnect的函数定义如下:
void HandleConnect(SOCKET insocket)
{
……
}
CreateThread创建后没有对它做任何释放好象并没有出现内存泄露状况(不知道是不是由于没有strcpy,new和mallooc等操作的缘故),但是当频繁创建的时候发现内存迅速增加
如下
while (Loop)
{
   _NewMainProc();
   sleep(10);
}void mComm::_NewMainProc()
{
int i;
HANDLE DBHandle;
DWORD dwThread;
ti=0;

for (i=0;i<MAXNUM;i++)
{
if (Connected!=NULL)
{
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)_Handle_Connection,(LPVOID)i,0,&dwThread);


}
}
}在_Handle_Connection中有strcpy,new和mallooc等操作,有人说应该用_beginthreadex?是不是这样的情况,如果是在beginthreadex中调用函数的形式是什么,如何传递参数?
例如调用void HandleConnect(int i)另外对与CreateThread是不是也应该进行资源释放操作?该怎么释放?

解决方案 »

  1.   

    CreateThread 返回的句柄,如果你不用的话应该关闭呀,另,我看你的线程函数定义也不对线程函数的原形是这样的:DWORD WINAPI ThreadProc(
      LPVOID lpParameter   // thread data
    );
    楼主用一个强制转型将一个类型不正确的函数地址传入了CreateThread ,应该取消那个强制转型, 如果编译不能通过,则说明你的线程函数定义不正确.
      

  2.   

    创建的线城不需要释放,线程终止的时候自动就释放了。但是你自己malloc的东西得你自己free。
    如果你要强制停止线程就要用TerminateThread(),但是在线程里面要响应这个并且释放你malloc分配的内存,不然会泄漏。你的循环内存消耗增加是正常的,看看是不是到一个峰值就不再增长了。如果还是继续增长,那么就可能是哪里泄漏了。
      

  3.   

    CreateThread返回一个句柄,这个句柄必须调用CloseHandle来关闭,无论线程是否结束。可以通过这个句柄调用GetExitCodeThread在线程结束后来获得线程返回值。
    _beginthreadex使用方法和CreateThread差不多,不过线程函数有点差别。具体参数含义MSDN里很详细,调用后无需释放句柄。
    如果用MFC,一定要用AfxBeginThread而不要用别的函数。正常情况下,不要用TerminateThread,因为被终结的线程 *绝对* 没有任何机会做任何工作,包括内存、资源的释放,要用信号的机制来告诉一个县城该结束了,然后等待县城结束。
      

  4.   

    CreateThread后没有释放,产生的是内核对象,跟你的程序无关的。