標準では、「thread :: id型のオブジェクトは、実行スレッドを表していないすべてのスレッドオブジェクトに対して単一の別個の値を提供します。これはoperator==
に関して単一の/別個の値ですか、それとも実際のビット単数/個別の値ですか?std :: thread :: idの要件。噴霧することはできますか?
質問の理由:MSVC2012のstd::thread::id::id()
は、そのフィールドの1つにガーベッジを残し、std::atomic<std::thread::id>
の比較交換を行うコードを破ります(後者はビット単位の比較に依存するため)。
std::atomic<std::thread::id>
は最初に法的な構成ですか?
EDITは:参考のために、コードは次のようになります:
while(!worker_id.compare_exchange_weak(no_id = thread_id_type(), self_id))
sleep();
ありがとうございます。選択的に 'no_id'をリセットするのはいいトリックです、なぜ私はそれが見えなかったのか疑問に思っています:) – vpozdyayev
しかし、おそらく" no_id!= std :: thread :: id() " ループの中。 – cmeerw
@cmeerwはい---私はvpozdyayevのループをできるだけ近く複製しようとしていました。 'compare_exchange_weak'が"間違って "失敗した場合、ほとんどの場合、待機せずにただちにループしたいと思っています。 –