Nachdem ich die std::thread
instanziieren beginnt es zu laufen (d. H. Call-Funktion) oder es startet nur, wenn ich join()
aufrufen, das ist ein wenig unklar in den Dokumenten.Wird std :: thread ausgeführt, bevor ich join() aufruft?
1
A
Antwort
2
Es wird ausgeführt, wenn Sie es instanziieren.
Joining wird verwendet, damit der aktuelle Thread wartet, bis der andere Thread die Ausführung beendet hat.
Einige Beispiel-Code von http://en.cppreference.com/w/cpp/thread/thread/thread
void f1(int n)
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread 1 executing\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
void f2(int& n)
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread 2 executing\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
int main()
{
int n = 0;
std::thread t1; // t1 is not a thread
std::thread t2(f1, n + 1); // pass by value
std::thread t3(f2, std::ref(n)); // pass by reference
std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread
t2.join();
t4.join();
std::cout << "Final value of n is " << n << '\n';
}
Possible output:
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 2 executing
Thread 1 executing
Final value of n is 5
1
Einmal std::tread
erstellt es in einem Fahrzustand ist, wo es Anweisungen ausführen kann.
Es gibt keine Garantie, dass es in einem bestimmten Zeitintervall überhaupt etwas tun wird, aber die Wahrscheinlichkeit, dass es etwas tut, nähert sich immer mehr 100%, da dieses Intervall länger und länger wird.
In der Regel garantiert Design für Lebendigkeit praktisch, dass, wenn Sie in Intervallen von Zehntel Sekunden aufstehen, alle Ihre nicht wartenden Threads eine gewisse Aktivität aufweisen.
Verwandte Themen
- 1. onReceive(); Methode wird ausgeführt, bevor ich
- 2. Thread ausgeführt wird nicht trotz der Methode join
- 3. Segmentierungsfehler, bevor main ausgeführt wird
- 4. Wie funktioniert Thread Join?
- 5. Thread wird nur einmal ausgeführt
- 6. jquery laden wird ausgeführt, bevor jquery lesen
- 7. jquery ausgeführt, bevor html geladen wird
- 8. wird C++ - Thread Join sofort zurückkehren oder nicht?
- 9. Wie initiiere ich einen std :: thread, der eine Funktion aufruft, die eine Funktion als Parameter erwartet?
- 10. Löschen Sie std :: thread nach dem Aufruf von Join?
- 11. NDK C++ std :: Thread abbrechen Absturz bei Join
- 12. std :: thread :: join() hängt, wenn nach main() aufgerufen wird bei Verwendung von VS2012 RC
- 13. JBPM-Workflow wird 24 Std. Ausgeführt
- 14. Warte auf das Versprechen zu lösen, bevor Code ausgeführt wird
- 15. sendOrderedBroadcast - Welcher Thread wird als Antwortempfänger ausgeführt?
- 16. Sperrcode wird in dem einen Thread ausgeführt
- 17. bewegen std :: thread
- 18. Ausführen Callback-Funktion auf Haupt-Thread von Std :: Thread
- 19. Javascript-Funktion wird ausgeführt, bevor es aufgerufen wird
- 20. Wie wird Code ausgeführt, bevor die erste Ansicht geöffnet wird?
- 21. Code wird ausgeführt, bevor for Schleife abgeschlossen ist, Thread-Pool C#
- 22. Warum jquery dann Callback ausgeführt wird bevor deferred aufgelöst wird?
- 23. Python-Interpreter-Code wird abgefangen, bevor er ausgeführt wird
- 24. viewDidLoad wird aufgerufen, bevor ganz init-Methode ausgeführt wird
- 25. angularjs $ routeProvider Route wird ausgeführt, bevor die Auflösung abgeschlossen wird
- 26. Wie wird die API-Methode ausgeführt, bevor Tabellenansicht geladen wird?
- 27. Std :: Karte Thread-Sicherheit
- 28. std :: thread move constructor
- 29. Std :: Thread Fehler (Thread nicht Mitglied der Std)
- 30. std :: unique_ptr als Parameter in std :: thread
Es beginnt sofort zu laufen. Es wäre ziemlich sinnlos, wenn ein neuer Thread warten würde, bis ein anderer Thread ihm beitreten möchte, bevor er etwas tut. –
Threads werden im laufenden Zustand erstellt, so dass der Thread vor dem Aufruf 'join()' ausgeführt wird. Und wenn Sie Ihre nächste Frage vielleicht vorwegnehmen, gibt es keine Option, einen Thread im gestoppten Zustand zu erstellen, obwohl Sie einen 'std :: mutex' oder ähnliches verwenden könnten, um Threads anzuhalten. –