2013-08-14 14 views
5

Jak czekać, aż wątek C++ 11 zostanie uruchomiony po utworzeniu? Wydaje się, że nie ma na to żadnej metody, w przeciwieństwie do innych bibliotek wątków (takich jak Qt), które oferują specjalną metodę sprawdzania, czy wątek jest uruchomiony, czy nie.Oczekiwanie na wątek C++ 11 do uruchomienia

+3

Jaki jest twój przypadek użycia? – Casey

+0

Tak, proszę opisać przypadek użycia. Wątki C++ 11 są "uruchamiane" zaraz po ich utworzeniu. Czy chcesz rozszerzyć interfejs API wątków o jakieś pojęcie "żywy/w toku" zamiast "zakończony/zakończony"? Czy chcesz zsynchronizować wątek z innym? Czy chcesz, aby nowe wątki były "pauzowane", dopóki nie zostanie jawnie rozpoczęte? Itd. – pilcrow

+2

Co oznacza "właściwie zacząć"? – Casey

Odpowiedz

11

Definicja języka wymaga, aby nowy wątek został uruchomiony przed powrotem konstruktora. Formalnie jest to [thread.thread.constr]/5: "Zakończenie wywołania konstruktora synchronizuje się z początkiem wywołania kopii f."

5

Nie jestem pewien, dlaczego musisz poczekać, aż zacznie się w pierwszej kolejności, ale jeśli to zrobisz, musisz użyć muteksu, warunku i flagi wskazanej, czy jest ona uruchomiona, czy nie. W nowo utworzonym wątku zablokuj muteks, ustaw flagę na "true" i powiadom kelnera (y) na zmiennej warunkowej. W kodzie, który tworzy wątek, zablokuj muteks i sprawdź flagę. Jeśli flaga jest "prawdziwa" - twoja nić jest uruchomiona, jeśli jest "fałsz", poczekaj na zmienną warunkową i powtórz raz obudzony.

+0

Dzięki. Miałem nadzieję, że jest lepsze rozwiązanie, którego mi brakuje, ale chyba nie. –

+0

Lub użyj obiektu czekającego, takiego jak zdarzenie w Win32, wtedy nie potrzebujesz muteksu lub flagi, tylko zdarzenie działające jako warunkowe. Lub po prostu używaj flagi bool samodzielnie i masz pętlę tworzenia wątku, dopóki flaga nie zostanie ustawiona. Nie trzeba go blokować. –

+0

@pilcrow: a jeśli nie? –