該標準規定:「一個thread :: id類型的對象爲所有不代表執行線程的線程對象提供一個不同的值。這是關於operator==
的單一/不同值,還是實際按位單一/不同值?對std :: thread :: id的要求。它可以被霧化嗎?
問題的原因:MSVC2012的std::thread::id::id()
在其中一個字段中留下垃圾,並且它破壞了在std::atomic<std::thread::id>
上進行比較交換的代碼(因爲後者取決於按位比較)。
是std::atomic<std::thread::id>
法律建設的第一位?
編輯:用於參考,代碼是這樣的:
while(!worker_id.compare_exchange_weak(no_id = thread_id_type(), self_id))
sleep();
謝謝。選擇性地重置'no_id'是個不錯的技巧,現在我開始想知道爲什麼我沒有看到它:) – vpozdyayev
但是,如果「no_id!= std :: thread :: id(),你可能只想調用sleep 「 在循環。 – cmeerw
@cmeerw是的 - 我只是試圖儘可能地複製vpozdyayev的循環。如果'compare_exchange_weak'虛假地「失敗」,那麼你在大多數情況下想立即循環,而不用等待。 –