25

std::atomicタイプはコピー構築可能またはコピー割り当て可能ではないようです。なんで?

アトミックタイプをコピーできない技術的な理由はありますか?または、ある種の不正なコードを回避するために、インターフェイスが意図的に制限されていますか?

4

2 に答える 2

28

アトミック命令のない(またはすべての整数サイズのアトミック命令のない)プラットフォームでは、原子性を提供するために型にミューテックスを含める必要がある場合があります。ミューテックスは通常、コピーまたは移動できません。

std::atomic<T>すべてのプラットフォームにわたるすべての専門分野で一貫したインターフェースを維持するために、タイプをコピーすることはできません。

于 2013-03-06T14:36:29.170 に答える
19
  1. 技術的な理由:ほとんどのアトミックタイプは、ロックフリーであることが保証されていません。アトミックタイプの表現には、埋め込まれたミューテックスを含める必要がある場合があり、ミューテックスはコピーできません。

  2. 論理的な理由:アトミックタイプをコピーするとはどういう意味ですか?コピー操作全体がアトミックであると予想されますか?コピーとオリジナルは同じアトミックオブジェクトを表しますか?

これを価値のあるものにする2つの別々のアトミックオブジェクトにまたがる操作には、明確に定義された意味はありません。実行できることの1つは、あるアトミックオブジェクトから別のアトミックオブジェクトにロードされた値を転送することです。ただし、ロードは前のオブジェクトに対する他の操作とのみ直接同期しますが、ストアは宛先オブジェクトに対する操作と同期します。また、各パーツには、完全に独立したメモリ順序の制約があります。

ロードの後に​​ストアが続くなどの操作をスペルアウトすると、それが明示的になりますが、割り当てでは、参加しているオブジェクトのメモリアクセスプロパティにどのように関連するのか疑問に思うでしょう。主張する場合は、の既存の変換を組み合わせることで同様の効果を得ることができますstd::atomic<..>(値型の明示的なキャストまたは他の中間体が必要です)。

于 2013-03-06T15:05:17.240 に答える