2011-11-25 106 views
0

根据MSDN:制作父线程一直等到子线程完成在VC

WaitForSingleObject功能可以等待以下对象:

Change notification 
Console input 
Event 
Memory resource notification 
Mutex 
Process 
Semaphore 
Thread 
Waitable timer 

然后我们可以使用WaitForSingleObject使父线程等待为孩子。

int main() 
{ 
    HANDLE h_child_thread = CreateThread(0,0, child, 0,0,0); //create a thread in VC 

    WaitForSingleObject(h_child_thread, INFINITE); //So, parent-thread will wait 

    return 0; 

} 

问题

  1. 是否有任何其他的方式让家长线程等待在VC或Windows的孩子的呢?

  2. 我不太明白的WaitForSingleObject这里的用法,岂不是线程的处理将可当线程终止

回答

1

第一次蹲伏 - 是的。这里常用的方法是“加入”。用法与语言有关。

在.NET C++中,你可以使用Thread的Join方法。这是从MSDN:

Thread* newThread = new Thread(new ThreadStart(0, Test::Work)); 
newThread->Start(); 

if(newThread->Join(waitTime + waitTime)) 
{ 
    Console::WriteLine(S"New thread terminated."); 
} 
else 
{ 
    Console::WriteLine(S"Join timed out."); 
} 

其次,当你与“WaitForSingleObject的”信号时,线程终止,但是手柄仍然有效(对于终止线程)。所以你仍然需要用CloseHandle明确地关闭句柄。

+0

虽然我本质上同意你的帖子,但你应该注意到你的代码片段不是C++,你在你的例子中使用的Thread类是.NET类库的一部分,所以它只能用于.NET系列语言。 – Miguel

+0

正确,我使用的事实是用户提到这是一个Windows应用程序。但是我会将其添加到关于#2的答案 – idanzalz

1
  1. 您可以以多种方式在线程之间建立通信,并且终止线程可以以某种方式发出其等待线程的信号。它可以像写入一些特殊值到等待线程可以检查的共享内存位置一样简单。但是这并不能保证终止线程在等待线程看到特殊值(排序/竞争条件)或终止线程在此之后不久终止时终止(它可以挂起或阻塞某事物),并且它不会保证在终止线程实际终止(线程可能崩溃)之前设置特殊值。 WaitForSingleObject(及其伴随的WaitForMultipleObjects)在发生线程终止时是一种可靠的方法。只要使用它。
  2. 手柄仍然可用,其价值不会消失。但是在线程终止后它几乎没用,除非你需要这个句柄来获得线程退出代码。最后你仍然需要关闭手柄。这是除非你可以处理/内存泄漏。
+1

中,该句柄不是无用的,您可以使用它从已结束的线程获取返回码,如果这对您的应用程序有用。 – Miguel

+0

@米格尔:你是对的,我错过了那一个。 –

相关问题