我通过"CreateThread"函数创建了一个线程.
在这个帖子中,我有一个'while(true)'循环(读取输入).
现在,当我想关闭线程时,我使用'CloseHandle'函数.
这是正确的做法吗?或者我应该退出'while(true)'循环,然后使用'CloseHandle'函数?
谢谢
Con*_*iou 12
CloseHandle()不会破坏,终止或延续线程,它只会破坏句柄本身(所以你没有一个句柄来杀死线程或等待它).线程继续正常工作(我已经在很多情况下使用了它),并且阻止它的唯一方法是退出线程函数(ThreadProc()),或者杀死它.
通常这个(调用TerminateThread)是一件坏事,因为线程可能会分配一些资源(即文件描述符),这些资源在整个进程终止之前将不可用.更重要的是,CloseHandle不会停止该线程.
如果你的线程中有一些冗长的操作,那么至少要使用
while(!ShouldExit)
{
DoOneMoreIteration();
}
Run Code Online (Sandbox Code Playgroud)
周期.这样你可以通过将ShouldExit设置为1来终止线程(或者如果它是C++和bool变量则为'true')并在此线程的句柄上调用WaitForSingleObject以确保它已完成.
对于伊兰的评论:必须将ShouldExit声明为"易变".
如果您正在等待某些输入(我想是一个控制台),那么您可以使用标准输入的非阻塞("重叠")I/O.
例如,请参阅此问题:检查Win32文件流以获取可用输入
它会是这样的
HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
while(!ShouldExit) {
if(WaitForSingleObject(h, FALSE, SomeTimeoutValue) == WAIT_OBJECT_0)
{
... use std::cin - it has some input and won't block
}
}
Run Code Online (Sandbox Code Playgroud)
为了使事情变得更好(避免CPU过度使用),请使用WaitForMultipleObjects并在某些外部事件上突破循环.
/// Global var
HANDLE SomeGlobalEvent;
/// ThreadProc():
HANDLE h[2];
h[0] = GetStdHandle(STD_INPUT_HANDLE);
h[1] = SomeGlobalEvent;
while(true) {
DWORD which = WaitForMultipleObjects(2, h, FALSE, SomeTimeoutValue);
if(which == WAIT_OBJECT_0)
{
... use std::cin - it has some input and won't block
} else
if(which == WAIT_OBJECT_1)
{
// got the termination event
break;
}
}
/// "Main" thread:
SomeGlobalEvent = CreateEvent(NULL, false, false, NULL);
HANDLE hThread = _beginthread(ThreadProc, 4096, NULL);
....
/// send termination signal
SetEvent(SomeGlobalEvent);
/// Wait for thread completion
WaitForSingleObject(hThread);
Run Code Online (Sandbox Code Playgroud)