C++ Windows C++;-带闭合手柄的闭合螺纹
我已经通过“CreateThread”函数创建了一个线程 在这个线程中,我有一个“while(true)”循环(读取输入) 现在,当我想关闭线程时,我使用“CloseHandle”函数 这样做对吗?或者我应该退出“while(true)”循环,然后使用“CloseHandle”函数 谢谢一般来说,这样做(调用TerminateThread)是不好的,因为线程可能会分配一些资源(即文件描述符),这些资源在整个进程终止之前是不可用的。更重要的是,CloseHandle不会停止线程 如果线程中有一些冗长的操作,那么至少使用C++ Windows C++;-带闭合手柄的闭合螺纹,c++,windows,C++,Windows,我已经通过“CreateThread”函数创建了一个线程 在这个线程中,我有一个“while(true)”循环(读取输入) 现在,当我想关闭线程时,我使用“CloseHandle”函数 这样做对吗?或者我应该退出“while(true)”循环,然后使用“CloseHandle”函数 谢谢一般来说,这样做(调用TerminateThread)是不好的,因为线程可能会分配一些资源(即文件描述符),这些资源在整个进程终止之前是不可用的。更重要的是,CloseHandle不会停止线程 如果线程中有一些冗
while(!ShouldExit)
{
DoOneMoreIteration();
}
循环。这样,你可以通过将BuffDeExt设置为1(或者“true”,如果是C++和布尔变量)和这个线程的句柄上的调用WaitForSingleObject来保证线程已经结束,终止线程。
对于eran的评论:ShouldExit必须声明为“volatile”
如果您正在等待一些输入(我想是控制台),那么您可能会对标准输入使用非阻塞(“重叠”)I/O
例如,见以下问题:
大概是
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
}
}
为了使事情变得更好(避免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);
最好是仔细阅读这些文件。Win32 API有很好的文档记录 从上面说 线程执行从lpStartAddr指定的函数开始 参数如果此函数返回,则使用DWORD返回值 在对ExitThread函数的隐式调用中终止线程。 使用GetExitCodeThread函数获取线程的返回值
接下来,您应该让线程入口函数完成它的工作并完成它。也就是说,退出将返回线程入口函数的循环。CloseHandle()不会销毁、终止或停止线程,它只销毁句柄本身(因此您没有句柄来终止线程或等待线程)。线程继续正常工作(我在许多情况下都使用了这个功能),停止它的唯一方法是退出线程函数(ThreadProc()),或者杀死它。@kakush,如果您选择
ShouldExit
,请确保将其声明为volatile
。否则,它可能就不起作用。@ Ern:<代码>易失性< /C> >技巧只适用于VisualC++编译器。它可能无法在其他编译器上运行。“其他”-你是指gcc?它将在嵌入式IAR的C编译器和GCC上运行。@eran:“volatile”。维克托拉提波夫说,这几乎是“无处不在”,不是我声称volatile只在VC上工作。。。但是在这个主题上已经提出了很多问题,深入讨论细节已经超出了这个问题的范围。注意:要删除thread对象,句柄必须在使用后关闭..>关闭线程句柄不会终止关联的线程或删除线程对象。关闭流程句柄不会终止关联的流程或删除流程对象。要删除线程对象,必须终止该线程,然后关闭该线程的所有句柄。