1. 如果创建的线程属于阻塞类型的,比如线程函数中有套接字recv、sendto类似的操作,可能会死等着接收数据,这时想要退出该线程,只能用:
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ),强行终止该线程。
事实上,也没有好办法了,因为该线程的while循环不“转”了!
2. 如果创建的线程内while循环能够正常的在“转动”,应该使用下面方法:
bool g_bExit = false;
//测试是否安全退出的指针
unsigned char *buf = NULL;
UINT MyControllingFunction( LPVOID pParam )
{
while(1)
{
static int k = 0;
printf("线程内操作: %d\n", k++);
Sleep(2000);
if(g_bExit)
break;
}
free(buf);
buf = NULL;
return 1L;
}
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
//创建一个线程
CWinThread *pThread = AfxBeginThread(MyControllingFunction, NULL);
//随便分配一块内存区域
buf = (unsigned char *)malloc(1024);
//主线程
while(1)
{
if(kbhit())
{
char ch = getch();
if(ch == 27)//ESC
{
printf("主线程退出\n");
g_bExit = true;
break;
}
}
}
//一直等待创建的线程完全退出
::WaitForSingleObject(pThread->m_hThread, INFINITE);
}
return nRetCode;
}
上述代码段的用意是:① 借助一个全局变量通知被创建的线程循环break后退出;② 在主线程使用WaitForSingleObject等待线程结束。
上述代码段的buf动态内存是模拟了在创建的线程,如果完全退出时,buf会被free释放掉,反之buf会内存泄露。可以注释掉WaitForSingleObject来验证buf是否存在内存泄露。
线程内Sleep两秒的用意,该线程不是一个完全阻塞线程,但又不是“转动”很快的线程。当主线程的while循环退出后,能观察到::WaitForSingleObject的作用。