2013-08-29 19 views
5

So scheint dies ziemlich einfach:Warum müssen Sie explizit Threads beitreten?

#include <iostream> 
#include <thread> 

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

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

    return 0; 
    cin.get(); 
} 

Wenn ich nicht beinhalten join() dann das System abort() nennt. Ich verstehe das nicht, sollte der Thread nicht von alleine gehen? Wenn man Threads beitreten möchte, scheint es schwieriger zu sein, den Code richtig einzukapseln. Was ist damit los?

+2

Hier ist eine gute Lektüre dazu: http://www.domaigne.com/blog/computing/joinable-and- detached-threads/ – LarryPel

+2

'main' muss' int' zurückgeben. – chris

+2

Das wird nicht kompiliert, weil es ein paar 'include' Direktiven fehlen. http://sscce.org/ –

Antwort

4

Das ist Teil des Entwurfs der C++ - Threading-Bibliothek. Sie brauchen nicht brauchen bis join der Thread, können Sie auch detach es. Aber ich würde nicht empfehlen, dass Sie standardmäßig detach -ing-Threads verwenden, da dies eigene Komplikationen mit sich bringt.

Im Gegensatz zu dem, was Sie sagen, ich denke nicht, dass dies macht den Code schwieriger zu kapseln. Es gibt verschiedene Abstraktionsebenen, und wenn Sie die Thread-Ebene wählen, müssen Sie sich bewusst sein, dass es Threads gibt, die Sie behandeln müssen.

Für verschiedene Dinge können Sie verschiedene Abstraktionsebenen wählen, zum Beispiel:

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, ich habe 'async' noch nicht berührt. – sircodesalot

+0

@sircodesalot: 'threads sind Low-Level-Primitive. Selbst das 'std :: future <>'/'std :: promise <>'/'std :: async' ist nicht so hoch, sondern der Standard, der benötigt wird, um mit etwas zu beginnen, auf das man sich einigen kann. Ich stelle mir vor, dass in naher Zukunft mehr und mehr hochrangige Konstrukte für die Standardisierung vorgeschlagen werden. Und es gibt bereits Bibliotheken für Parallelität, die Tools auf höherer Ebene bieten. –

+0

** 30.3.1.3 ** [Anmerkung: Das implizite Trennen oder Verknüpfen von eines Joinable() - Threads in seinem Destruktor kann zu schwer zu debuggenden Korrektheit führen (für Trennen) oder Leistung (für Join) nur bei Auftreten einer Ausnahme angehoben. Daher muss der Programmierer sicherstellen, dass der Destruktor niemals ausgeführt wird, solange der Thread noch verbindbar ist. -end note] – Jason

4

Standardmäßig müssen Threads beitreten, damit der Spawning-Thread die Aufgabe verfolgen und darauf warten kann, dass seine untergeordneten Elemente abgeschlossen werden (z. B. delegieren Sie eine Menge Arbeit an 2+ Threads und verbinden sie dann alle, um zu signalisieren, wann die Arbeit läuft erledigt).

Sie können detach verwenden, um zu bewirken, dass sich der Thread von seinem Laich-Thread löst und dadurch die Threads unabhängig ausgeführt werden.

+0

Aha! Das ist interessant. – sircodesalot

Verwandte Themen