2016-06-02 9 views
0

std::thread::join Dokument sagt, dass "Es blockiert den aktuellen Thread, bis der mit * gekennzeichnete Thread die Ausführung beendet."wird C++ - Thread Join sofort zurückkehren oder nicht?

Aber ich bin verwirrt, dass, wenn ich mehrere Threads erstellen und verbinden sie eins nach dem anderen, wie es scheint, dass die bisherige ‚helper1.join‘ nicht nächste ‚helper2.join‘ Anweisung blockiert, weil auf die gemäß Ausgabeergebnis manchmal t1 zuerst beenden, manchmal t2 zuerst beenden. Wie kann ich diese Situationen verstehen?

Beispielcode:

#include <iostream> 
#include <thread> 
#include <chrono> 

using namespace std; 
void foo() 
{ 
// simulate expensive operation 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    cout<<"this foo"<<endl; 
} 

void bar() 
{ 
// simulate expensive operation 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    cout<<"this one"<<endl; 
} 

int main() 
{ 
    std::cout << "starting first helper...\n"; 
    std::thread helper1(foo); 

    std::cout << "starting second helper...\n"; 
    std::thread helper2(bar); 

    std::cout << "waiting for helpers to finish..." << std::endl; 
    helper1.join(); 
    helper2.join(); 

    std::cout << "done!\n"; 

} 
+3

"Blockieren bis X endet" bedeutet nicht, dass Y nicht abgeschlossen werden kann, während Sie blockiert sind. –

+0

Nur weil Sie Leute in einer bestimmten Reihenfolge hereinlassen, heißt das nicht, dass sie in der gleichen Reihenfolge angekommen sind. – Galik

Antwort

4

In Ihrem Code haben Sie drei Themen: die beiden Sie starten und die durch das Betriebssystem gestartet ein, den roten Faden. Die join betrifft nur den Hauptthread, in dem sie ausgeführt wird. Die foo und bar Threads werden sofort beim Erstellen gestartet. Welcher seine Ausgabe zuerst druckt, hängt vom Scheduler ab und ist - wie Sie bemerkt haben - unbestimmt. Die join Anrufe stellen nur sicher, dass das "fertig!" wird gedruckt, nachdem die erstellten Threads fertig sind.

Verwandte Themen