Anforderungen für std :: thread :: id. Kann es atomisiert werden?

8

Der Standard sagt: "Ein Objekt vom Typ thread :: id stellt ... einen einzelnen eindeutigen Wert für alle Thread-Objekte zur Verfügung, die keinen Ausführungsthread darstellen." Ist das ein einzelner / bestimmter Wert in Bezug auf operator== oder ist es der tatsächliche bitweise einzelne / unterschiedliche Wert?

Der Grund für die Frage: MSVC2012 std::thread::id::id() lässt Müll in einem seiner Felder, und es bricht Code, der compare-exchange auf einem std::atomic<std::thread::id> (da letztere von bitweisen Vergleichen abhängt).

Ist std::atomic<std::thread::id> überhaupt ein rechtliches Konstrukt?

EDIT: für die Referenz geht der Code so:

%Vor%     
vpozdyayev 03.10.2012, 07:11
quelle

2 Antworten

10

Erstens ist std::atomic<std::thread::id> legal: std::thread::id muss trivial kopierbar sein (30.3.1.1p2), was die Anforderungen von std::atomic<> (29.5p1) erfüllt.

Da es sich jedoch um eine undurchsichtige Klasse handelt, ist es nicht erforderlich, dass das Bitmuster von Objekten, die mit "gleich" verglichen werden, identisch ist.

Wenn Sie also compare_exchange_weak oder compare_exchange_strong verwenden, kann es bei Werten, die mit "gleich" übereinstimmen, fehlschlagen.

Daher lautet der Ratschlag, compare_exchange_weak in einer Schleife zu verwenden, wobei den Wert expected als Ergebnis der vorherigen Iteration zurücklassen soll. .

In Ihrem Fall ist die Semantik, die ich aus Ihrer Schleife interpretiere, wie folgt: looping beibehalten, während worker_id die ID eines anderen Threads ist, oder worker_id war std::thread::id , aber der Austausch ist fehlgeschlagen. Sie können dies mit folgendem erreichen:

%Vor%

oder

%Vor%

d. Ändern Sie nur den no_id -Wert, wenn nicht std::thread::id() .

ist     
Anthony Williams 03.10.2012, 10:37
quelle
5

Dies wurde in LWG924 diskutiert. Im Wesentlichen können Sie compare_exchange_strong nicht verwenden, aber Sie sollten compare_exchange_weak in einer Schleife verwenden können, z. B.

%Vor%

Bearbeiten : Das bedingungslose Zurücksetzen des Wertes vereitelt den Zweck der Schleife - basierend auf dem mitgelieferten Code wäre die beste Lösung dann:

%Vor%     
cmeerw 03.10.2012 08:42
quelle