TerminateThread导致程序未响应

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函数那里导致程序未响应。

猜你喜欢

转载自blog.csdn.net/wangmeng0804/article/details/52873245