Warum laufen diese Threads nicht in der richtigen Reihenfolge?

7

Wenn ich diesen Code ausführe:

%Vor%

Ich erhalte die Ausgabe :

%Vor%

Obwohl ich einen Mutex verwendet habe, um nur einen Thread gleichzeitig zu verwenden. Warum ist die Ausgabe nicht in Ordnung?

    
template boy 03.12.2014, 21:35
quelle

4 Antworten

19

Was Ihr Mutex erreicht, ist, dass keine zwei Threads gleichzeitig gedruckt werden. Allerdings rasen sie immer noch, für welchen Thread er zuerst den Mutex erwirbt.

Wenn Sie eine serielle Ausführung haben wollen, können Sie nur Threads vermeiden.

    
inf 03.12.2014, 21:37
quelle
6

Es hängt völlig vom Betriebssystem ab, in welcher Reihenfolge Threads geplant sind. Sie können sich nicht auf eine Bestellung verlassen. Angenommen, es ist völlig zufällig.

    
Silicomancer 03.12.2014 21:40
quelle
3

Sie übergeben Lambda an emplace_back, das als Parameter für den Konstruktor std :: thread verwendet wird. Siehe die Details für emplace_back copy / pasted von cppreference.com.

"Fügt dem Ende des Containers ein neues Element hinzu. Das Element wird durch std :: allocator_traits :: construct erstellt, das normalerweise placement-new verwendet, um das Element an der vom Container bereitgestellten Position zu erstellen arguments args ... werden als std :: forward (args) .... "

an den Konstruktor weitergeleitet

Ссылка

Der Mutex im Body des Lambda hat keine Auswirkungen, bis das std :: thread-Objekt vollständig konstruiert wurde und den durch den Lambda-Körper definierten Thread-Eintrittspunkt ausführt. Einige der std :: -Threads können während der Schleife gestartet werden, oder die Threads werden möglicherweise erst nach Abschluss der Schleife gestartet. Sie können das nicht auf eine tragbare Weise herausfinden.

Nachdem die for-Schleife alle std :: -Threads in Ihrem Vektor erstellt hat, muss das Betriebssystem entscheiden, in welcher Reihenfolge die Threads ausgeführt werden sollen und auf diese Weise erhalten Sie die zufällige Reihenfolge Ihrer Ausgabe.

    
rparolin 05.12.2014 03:40
quelle
2

Die Ausführungsreihenfolge ist unerheblich, Sie können sie nicht vorhersagen und sie wird sich in einem gegebenen Lauf von Lauf zu Lauf und über die Zeit ändern.

Ihre Designs sollten niemals von der Ausführungsreihenfolge der Threads abhängig sein.

Es geht noch weiter: Wenn N-Threads auf ein Synchronisationsobjekt warten, sagen wir einen Mutex, und der Mutex freigegeben wird, gibt es keine Möglichkeit, zuverlässig und portabel vorherzusagen, welcher der wartenden Threads erwacht und den Mutex ergreift Als nächstes, unabhängig von ihren relativen Zeitplan Prioritäten.

Nicht-Determinismus macht Multithread-Programmierung schwierig: -)

    
Axel Rietschin 29.12.2014 02:02
quelle

Tags und Links