Windows C ++ - 使用CloseHandle关闭线程

时间:2012-06-27 12:21:02

标签: c++ windows

我通过“CreateThread”函数创建了一个线程。

在这个帖子中,我有一个'while(true)'循环(读取输入)。

现在,当我想关闭线程时,我使用'CloseHandle'函数。

这是正确的做法吗?或者我应该退出'while(true)'循环,然后使用'CloseHandle'函数?

由于

3 个答案:

答案 0 :(得分:9)

CloseHandle()不会破坏,终止或延续线程,它只会破坏句柄本身(因此你没有一个句柄来杀死线程或等待它)。线程继续正常工作(我已经在很多情况下使用了它),并且阻止它的唯一方法是退出线程函数(ThreadProc()),或者杀死它。

答案 1 :(得分:6)

通常这个(调用TerminateThread)是一件坏事,因为线程可能会分配一些资源(即文件描述符),这些资源在整个进程终止之前是不可用的。更重要的是,CloseHandle不会停止该线程。

如果你的线程中有一些冗长的操作,那么至少要使用

while(!ShouldExit)
{
     DoOneMoreIteration();
}

循环。这样你可以通过将ShouldExit设置为1来终止线程(或者如果它是C ++和bool变量则为'true'),并在此线程的句柄上调用WaitForSingleObject以确保它已完成。

对于eran的评论:必须将ShouldExit声明为'volatile'。

如果您正在等待某些输入(我想是一个控制台),那么您可以使用标准输入的非阻塞(“重叠”)I / O.

例如,请参阅此问题:Checking Win32 file streams for available input

这就像是

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);

答案 2 :(得分:3)

最好的事情是仔细阅读文档。 Win32 API已有详细记录。

来自MSDN on CreateThread in the Remarks section

  

线程执行从lpStartAddr指定的函数开始   参数。如果此函数返回,则使用DWORD返回值   在对ExitThread函数的隐式调用中终止线程。   使用GetExitCodeThread函数获取线程的返回值。

接下来,您应该让线程输入功能完成其工作并完成。即退出将返回线程入口函数的循环。