使父线程等到子线程在VC中完成

时间:2011-11-25 07:53:51

标签: windows multithreading winapi visual-c++

根据MSDN:

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在这里的用法,是否意味着当线程终止时线程的句柄可用

2 个答案:

答案 0 :(得分: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显式关闭句柄。

答案 1 :(得分:1)

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