La norma dice: "Un objeto de tipo thread :: id proporciona ... un único valor distinto para todos los objetos de subprocesos que no representan un subproceso de ejecución". ¿Es ese un valor único/distinto con respecto a operator==
, o es el valor real a nivel de bit único/distinto?Requisitos para std :: thread :: id. ¿Puede ser atomizado?
El motivo de la pregunta: std::thread::id::id()
de MSVC2012 deja basura en uno de sus campos, y rompe el código que compara-exchange en un std::atomic<std::thread::id>
(ya que este último depende de las comparaciones bit a bit).
¿Es std::atomic<std::thread::id>
una construcción legal en primer lugar?
EDIT: para la referencia, el código es el siguiente:
while(!worker_id.compare_exchange_weak(no_id = thread_id_type(), self_id))
sleep();
Gracias.Reestablecer selectivamente 'no_id' es un buen truco, ahora estoy empezando a preguntarme por qué no lo vi :) – vpozdyayev
Pero probablemente solo quieras llamar a sleep si" no_id! = Std :: thread :: id() " en el lazo. – cmeerw
@cmeerw Sí --- Estaba intentando replicar el bucle de vpozdyayev lo más cerca posible. Si 'compare_exchange_weak' falla" de forma espuria ", entonces en la mayoría de los casos, quiere hacer un bucle inmediatamente, sin esperar. –