2013-08-29 11 views
5

Więc ta wydaje się dość prosta:Dlaczego musisz jawnie dołączać do wątków?

#include <iostream> 
#include <thread> 

void second() { 
    cout << "Don't thread on me!" << endl; 
} 

int main() { 
    thread t { second }; 
    t.join(); 

    return 0; 
    cin.get(); 
} 

Gdybym nie obejmują join() wówczas system nazywa abort(). Nie rozumiem tego, czy wątek nie powinien wyjść sam? Jeśli chcesz dołączyć do wątków, wydaje się, że kod będzie trudniejszy do hermetyzacji. O co w tym chodzi?

+2

Oto dobry odczyt na ten temat: http://www.domaigne.com/blog/computing/joinable-and- oderwane wątki/ – LarryPel

+2

'główny' musi zwrócić' int'. – chris

+2

Nie skompiluje się, ponieważ brakuje kilku dyrektyw '# include'. http://sscce.org/ –

Odpowiedz

4

Jest to część projektu biblioteki wątków C++. Nie musisz trzeba do join wątku, można również detach go. Ale nie poleciłbym, abyś używał domyślnie detach -ing wątków, ponieważ przynosi to własny zestaw komplikacji.

Wbrew temu, co mówisz, nie sądzę, że to sprawia, że ​​kod jest trudniejszy do hermetyzacji. Istnieją różne poziomy abstrakcji, a wybór poziomu wątku oznacza, że ​​musisz mieć świadomość, że istnieją wątki i musisz sobie z nimi poradzić.

Dla różnych rzeczy można wybrać różne poziomy abstrakcji, na przykład:

int main() { 
    auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; }); 
    f.get();  // Wait for the task to complete 
} 
+0

Ah, jeszcze nie dotknąłem 'async'. – sircodesalot

+0

@sircodesalot: 'thread's są prymitywami niskiego poziomu. Nawet 'std :: future <>'/'std :: obietnica <>'/std :: async' nie są na tak wysokim poziomie, ale standard musi zacząć od czegoś, co można uzgodnić. Wyobrażam sobie, że w niedalekiej przyszłości zaproponowane zostaną kolejne kontrakty wysokiego poziomu dla standaryzacji. Istnieją już biblioteki do współbieżności, które oferują narzędzia na wyższym poziomie. –

+0

** 30.3.1.3 ** [Uwaga: albo niejawne odłączenie lub dołączenie do wątku w jego destruktorze może spowodować problemy z poprawieniem błędów (dla odłączenia) lub (błędy dołączania) błędów napotkanych tylko wtedy, gdy wyjątek jest podniesiony. W ten sposób programista musi zapewnić, że destruktor nigdy nie zostanie wykonany, dopóki wątek nadal będzie mógł być łączony. -end note] – Jason

4

Domyślnie wątki muszą się łączyć, aby śledzący wątek mógł śledzić i czekać na ukończenie swoich dzieci (na przykład oddelegowałeś pracę do 2+ wątków, a następnie przyłączyłeś je wszystkie, aby zasygnalizować, kiedy praca jest Gotowe).

Możesz użyć detach, aby spowodować, że wątek odłączy się od wątku, co spowoduje, że wątki będą działać niezależnie.

+0

Aha! To interesujące. – sircodesalot

Powiązane problemy