一、VC中可以用如下方法创建一个线程:
CWinThread *pThread = AfxBeginThread(ThreadFunc , &ThreadInfo);
返回值: 一个指向新线程的线程对象
终止一个线程可以有两种方式:
1、当工作者线程执行一个返回语句时,线程终止。
2、调用AfxEndThread()时,工作者线程就会终止。
线程的执行状态可以用下面的函数来获取线程的退出码:
DWORD dwExitCode;
::GetExitCodeThread(pThread->m_hThread, &dwExitCode);
当线程仍然执行时,::GetExitCodeThread() 函数会把dwExitCode置为STILL_ACTIVE。
但是如果该线程被终止,CWindThread对象默认自动删除它自己,因此GetExitCodeThread()函数就会访问无效的pThread。解决这个问题可以通过如下设置来解决:
pThread->m_bAutoDelete = FALSE;
这种方式需要手动删除句柄:
CloseHandle(pThread->m_hThread);
否则会造成内核对象的泄露!!
删除内核对象句柄:
关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。
如上节所示:如果该线程被终止,CWindThread对象默认自动删除它自己,因此如果没有设置m_bAutoDelete = FALSE ,直接在线程结束后调用CloseHandle()就会造成空句柄错误!!!