TerminateThread函数的作用是在线程外终止一个线程,属于强制终止,线程里面的资源不会被回收,所以使用此函数是很危险的。比如下面的两个例子
demo1:
DWORD __stdcall mythread(void* )
{
while( true )
{
char* p = new char[1024];
delete p;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL);
Sleep(1000);
TerminateThread(h, 0);
h = NULL;
char* p = new char[1024]; //这里会死锁,过不去
delete []p;
return 0;
}
为什么死锁呢?new操作符用的是小块堆,整个进程在分配和回收内存时,都要用同一把锁。如果一个线程在占用该锁时被杀死(即临死前该线程在new或delete操作中),其他线程就无法再使用new或delete了,表现为hang住。
上面的例子是网上的例子。下面的例子是我实际项目中遇到的
demo2:
void CTransmitDlg::OnBnClickedBtnNetOpenClose()
{
// TODO: Add your control notification handler code here
TerminateThread(m_hThread,0);
}
DWORD WINAPI RecThread(LPVOID lpParam){
while(1)
{
ret=recv(sock,(char*)szBuff,sizeof(szBuff),0);
}
}
这段代码在点击断开连接的时候会强制杀掉RecThread线程,此时recv函数可能还没有返回,这个时候再进行创建套接字的时候会死锁在socket函数那里导致程序未响应。