Заставьте родительский поток ждать, пока дочерний поток не завершится в VC - PullRequest
0 голосов
/ 25 ноября 2011

По данным 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 ]

1 голос
/ 25 ноября 2011
  1. Вы можете установить связь между потоками несколькими способами, и завершающий поток может как-то сигнализировать своему ожидающему потоку.Это может быть так же просто, как записать какое-то специальное значение в общую память, которую может проверить ожидающий поток.Но это не гарантирует, что завершающий поток завершится, когда ожидающий поток увидит специальное значение (условия упорядочивания / гонки), или что завершающий поток завершится вскоре после этого (он может просто зависнуть или заблокировать что-либо) и не будетгарантировать, что специальное значение когда-либо будет установлено до фактического завершения завершающего потока (поток может потерпеть крах).WaitForSingleObject (и его компаньон WaitForMultipleObjects) - верный способ узнать о завершении потока при его возникновении.Просто используйте его.
  2. Дескриптор все еще будет доступен в том смысле, что его значение не исчезнет.Но это практически бесполезно после завершения потока, за исключением того, что вам нужен этот дескриптор, чтобы получить код завершения потока.И вам еще нужно закрыть ручку в концеЭто, если вы не в порядке с ручкой / утечки памяти.
1 голос
/ 25 ноября 2011

за первую очередь - да.Метод, обычно используемый здесь, это «Присоединиться».использование зависит от языка.

В .NET C ++ вы можете использовать метод Join Thread.это из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...