Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows C++;-带闭合手柄的闭合螺纹_C++_Windows - Fatal编程技术网

C++ Windows C++;-带闭合手柄的闭合螺纹

C++ Windows C++;-带闭合手柄的闭合螺纹,c++,windows,C++,Windows,我已经通过“CreateThread”函数创建了一个线程 在这个线程中,我有一个“while(true)”循环(读取输入) 现在,当我想关闭线程时,我使用“CloseHandle”函数 这样做对吗?或者我应该退出“while(true)”循环,然后使用“CloseHandle”函数 谢谢一般来说,这样做(调用TerminateThread)是不好的,因为线程可能会分配一些资源(即文件描述符),这些资源在整个进程终止之前是不可用的。更重要的是,CloseHandle不会停止线程 如果线程中有一些冗

我已经通过“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对象,句柄必须在使用后关闭..>关闭线程句柄不会终止关联的线程或删除线程对象。关闭流程句柄不会终止关联的流程或删除流程对象。要删除线程对象,必须终止该线程,然后关闭该线程的所有句柄。