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% 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:
oder
%Vor% d. Ändern Sie nur den no_id
-Wert, wenn nicht std::thread::id()
.
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.
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%Tags und Links c++ multithreading c++11 language-lawyer atomic