2016-11-04 2 views
0

I Thread-ID drucken kann wie folgt zu trösten:Hat this_thread :: GET_ID() immer mit jedem neuen Thread erhöhen gestartet

cout << "thread ID: " << std::this_thread::get_id() << endl; 

Danach werden die auf Konsole gedruckt IDs entspricht IDs, die in Visual gefunden werden kann Studio 2013 Gemeinschaft unter:

Debug -> Windows -> Threads -> [ID column] 

Wenn ich in Debug -> Windows -> Threads von dieser ID sortieren Sie aufsteigend erhalte ich die Reihenfolge, in den Themen? Oder In anderen Worten: std::this_thread::get_id() wird immer mit jedem neuen Thread inkrementiert oder kann es auch dekrementieren?

+0

Thread-IDs können wiederverwendet werden, und der Standard stellt sehr geringe Anforderungen an die textliche Darstellung der ID. Wenn Sie nur über Windows und eine Situation sprechen, in der Ihre Threads für die Dauer des Programms laufen, dann bin ich mir nicht sicher. – TartanLlama

Antwort

3

Kurze Antwort: nein, Thread-ID wird nicht unbedingt mit jedem neuen Thread erhöht. Thread-IDs können wiederverwendet werden.


Der Standard sagt

  1. Ein Objekt vom Typ Thread :: id stellt eine eindeutige Kennung für jeden Thread der Ausführung und einem einzigen eindeutigen Wert für alle Thread Objekte, die dies nicht tun repräsentieren einen Thread der Ausführung (30.3.1). Jeder Thread der Ausführung hat ein zugeordnetes thread :: id Objekt, das ungleich dem thread :: id Objekt eines anderen Ausführungs-Threads ist und das nicht ist, das dem thread :: id Objekt eines beliebigen std :: threads entspricht Objekt, das nicht repräsentiert Threads der Ausführung.

  2. thread :: id soll eine trivial kopierbare Klasse sein (Abschnitt 9). Die Bibliothek kann den Wert einer thread :: id eines abgeschlossenen Threads wiederverwenden, der nicht mehr verbunden werden kann.

- n4296; 30.3.1.1 [thread.thread.id]

Es heißt nicht, dass die ID monoton steigt, und es tut Genehmigung Thread-IDs wiederverwendet werden.

Es ist wahrscheinlich, dass Sie die native_handle möchten, die das Handle sein wird, das die zugrunde liegende Implementierung verwendet. Dies entspricht dem Windows-Thread-Handle unter MSVC. Ob diese monoton ansteigen, hängt von der Dokumentation Ihrer Implementierung ab.

Die MSDN-Dokumentation für die Funktion GetCurrentThreadId schlägt vor, dass die Thread-ID einen Thread eindeutig identifiziert, bis er beendet wird; es sagt nicht, ob die IDs monoton ansteigen, und die Implikation dieses Satzes scheint zu sein, dass sie wiederverwendet werden können.

Zusammenfassend, der C++ - Standard bietet keine Garantie für die Werte der Thread-IDs. Wenn Sie dies garantieren wollen, müssen Sie jeden Thread um einen Atomzähler erhöhen lassen oder auf andere Weise einen monoton ansteigenden Wert mit entsprechender Synchronisation erhalten.

+0

Gibt es also einen zuverlässigen Weg, wie ich feststellen kann, welcher Thread zuerst, zweiter, dritter ... gestartet wurde? –

+0

Kurz gesagt: nein. Die Frage macht vielleicht keinen Sinn. Beachten Sie, dass Sie einen zusätzlichen Thread starten - Sie haben jetzt zwei. Jeder Thread startet einen anderen ... welcher wurde zuerst gestartet? Wenn sie auf verschiedenen Kernen ausgeführt werden, können sie gleichzeitig starten (Modulo-Locking in der OS-Threading-Schicht). Was versuchst du eigentlich zu erreichen? – Andrew

+0

@WakanTanka Sie könnten einen gemeinsamen atomaren Zähler behalten, den Sie am Anfang jedes Threads erhöhen. Aber ja, du solltest skizzieren, welches Problem du lösen willst. – TartanLlama

0

Die Antwort ist wahrscheinlich.Für eine bestimmte Implementierung ist dies eine nützliche Debugging-Heuristik (insbesondere wenn die Thread-Handles geschlossen sind).

Wenn Sie sich andererseits auf die Programmkorrektheit verlassen wollen, gibt der Standard keine solche Garantie, und Sie müssen Ihr zugrunde liegendes Problem auf andere Weise lösen.

Verwandte Themen