Standard mówi: "Obiekt typu thread: id zapewnia ... pojedynczą odrębną wartość dla wszystkich obiektów wątku, które nie reprezentują wątku wykonania". Czy jest to pojedyncza/odrębna wartość w odniesieniu do operator==
, czy jest to rzeczywista wartość pojedyncza/różna bitowo?Wymagania dla std :: thread :: id. Czy może być atomizowany?
Powód pytania: std::thread::id::id()
MSVC2012 pozostawia śmieci w jednym z jego pól, a następnie łamie kod, który dokonuje porównania na std::atomic<std::thread::id>
(ponieważ ten ostatni zależy od porównań bitowych).
Czy std::atomic<std::thread::id>
jest konstrukcją prawną?
EDIT: dla odniesienia, kod wygląda tak:
while(!worker_id.compare_exchange_weak(no_id = thread_id_type(), self_id))
sleep();
Dziękuję.Selektywne resetowanie 'no_id' jest miłym trikiem, teraz zaczynam się zastanawiać, dlaczego go nie widziałem :) – vpozdyayev
Ale prawdopodobnie chciałbyś wywołać tylko uśpienie, jeśli" no_id! = Std :: thread :: id() " w pętli. – cmeerw
@ cmeerw Tak --- Próbowałem tylko jak najwierniej odwzorować pętlę vpozdyayeva. Jeśli 'compare_exchange_weak' nie powiedzie się" fałszywie ", to w większości przypadków chcesz zapętlić się natychmiast, bez czekania. –