2011-11-25 86 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

@米格爾:你是對的,我錯過了那一個。 –