2017-01-24 6 views
3

ich immer im Internet sah die Regel:Qestion zu verstehen "lösen()" auf Threads in C++

Wenn Sie nicht lösen \ einen Thread beitreten, wird dann aufgerufen werden, den Vorgang abzubrechen.

Ich brauche einen Grund, warum dieser Abbruch geschieht.

Ich kann mit Join verstehen - denn wenn nicht tun, um zu einem Thread zu verbinden, kann die Main vor dem Thread geschlossen werden und es kann Probleme machen.

Aber loslösen tut nichts! Es hat keinen Zweck (zumindest von dem, was ich gesehen habe, wenn ich einen Thread mit oder ohne losgelöst habe).

Was genau machen den Abbruch zu springen, was genau ist der Zweck der Trennung?

Hier ist ein einfaches Beispiel für das, was verursacht „Abbruch“:

#include <iostream>  // std::cout 
#include <thread>   // std::thread, std::this_thread::sleep_for 
#include <chrono>   // std::chrono::seconds 

void pause_thread(int n) 
{ 
    std::this_thread::sleep_for (std::chrono::seconds(n)); 
    std::cout << "pause of " << n << " seconds ended\n"; 
} 

int main() 
{ 
    std::cout << "Spawning and detaching 3 threads...\n"; 
    std::thread (pause_thread,1); 
    std::cout << "Done spawning threads.\n"; 
    // give the detached threads time to finish (but not guaranteed!): 
    pause_thread(5); 
    return 0; 
} 
+1

Wie kommt es, dass 'detach' nicht alles tun ?! Stellen Sie sich vor, dass, wenn der Haupt-Thread einen anderen Thread erzeugt, dieser abhängig von seinem Elternteil zu seinem Slave wird. Wenn Sie den untergeordneten Thread "trennen", bricht er los und lebt sein eigenes Leben. – ForceBru

+0

@ForceBru Wie siehst du dieses Reflektieren in einem Programm? Jeder, der mir das erklärt, sagt mir dasselbe. dass der Thread "frei wird !!!" aber was bedeutet es????? –

+0

bedeutet dies, dass dieser Thread jetzt unabhängig von anderen Threads ist: wenn sein Eltern-Thread beendet wird, läuft er weiter, während der 'Slave'-Thread in diesem Fall Selbstmord begehen muss. – ForceBru

Antwort

0

Ein Thread ist ein anderes Tier von einem Prozess. Threads sind nicht in einer Eltern/Kind-Beziehung überhaupt.

Die C++ 11-Thread-Implementierung muss mit allen wichtigen Betriebssystem-Threads kompatibel sein und musste daher Design-Entscheidungen treffen, die auf den ersten Blick nicht verstanden werden können.

Ich werde Pthread beschreiben, die in der Linux-Welt verwendet wird.

Wenn Sie einen Thread erstellen, können Sie seinen Trennzustand angeben. Es können zwei Werte sein:

  • DETACHED: Wenn der Thread beendet wird, werden seine zugewiesenen Ressourcen automatisch freigegeben. Gewinde kann nicht verbunden werden.
  • JOINABLE: Wenn der Thread beendet wird, werden einige seiner Ressourcen nicht automatisch freigegeben. Zum Beispiel seinen Rückgabecode (in Pthread gibt es einen Rückgabewert eines Threads). Gewinde kann verbunden werden. Ressourcen werden unter join() freigegeben.

C++ - Threads werden als JOINABLE erstellt, aber Sie können sie später trennen.

Wenn Sie nun einen Thread bei ~thread() nicht trennen/beitreten, was könnte eine Thread-Implementierung tun? Es ist ein Problem, denn wenn es nichts tut, dann werden einige Ressourcen leise (als joinable Thread, wenn Ausfahrten, sind einige seine Ressourcen nicht automatisch freigegeben) geleckt werden

  • Anruf join() automatisch: keine gute Idee, da das Programm darauf stehen kann (wenn der Thread noch läuft). Es ist möglicherweise ein Programmierfehler.
  • Anruf detach() automatisch: keine gute Idee, entweder, wie es könnte ein Programmfehler sein (Thread weiterhin laufen, aber sein thread Objekt zerstört wird - ein Programmierer explizit detach() in diesem Fall nennen soll)
  • Anruf abort() : das ist das beste, was eine Implementierung, Programmierfehler zu vermeiden tun können

So sind die Designer von std::thread wählte abort() anrufen Programmierfehler zu vermeiden.

(Unter Windows ist das Fadensystem ähnlich. Sie haben CloseHandle für einen Thread nennen, so kann seine Ressourcen freigegeben werden)