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";
}
"Blockieren bis X endet" bedeutet nicht, dass Y nicht abgeschlossen werden kann, während Sie blockiert sind. –
Nur weil Sie Leute in einer bestimmten Reihenfolge hereinlassen, heißt das nicht, dass sie in der gleichen Reihenfolge angekommen sind. – Galik