【问题标题】:Make parent thread wait till child thread finishes in VC让父线程等到子线程在VC中完成
【发布时间】:2011-11-25 07:53:50
【问题描述】:

根据 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的用法,是不是表示线程终止时线程的句柄才可用

【问题讨论】:

    标签: windows multithreading winapi visual-c++


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

    【讨论】:

    • 关于#2,句柄不是无用的,如果对您的应用程序有用,您可以使用它从结束的线程中获取返回码。
    【解决方案2】:

    对于第一个问题 - 是的。这里常用的方法是“Join”。用法取决于语言。

    在 .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 显式关闭句柄。

    【讨论】:

    • 虽然我基本上同意您的帖子,但您应该注意您的代码 sn-p 不是 C++,您在示例中使用的 Thread 类是 .NET 类库的一部分,所以它只能在 .NET 系列语言中使用。
    • 正确,我使用的是用户提到这是一个 Windows 应用程序的事实。但我会将其添加到答案中
    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 2012-04-13
    • 2012-07-22
    • 2020-09-21
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多