X86 のインクリメント メモリ マシン命令は、 LOCKプレフィックス と共に使用する場合にのみアトミックです。
C および C++ のx++には、アトミックな動作がありません。ロックされていないインクリメントを行う場合、プロセッサが X を読み書きする競合が原因で、2 つの別々のプロセッサがインクリメントを試みた場合、1 つのインクリメントだけ、または両方が表示される可能性があります (2 番目のプロセッサが初期値を読み取ってインクリメントされた可能性があります)。最初の結果が書き戻された後に書き戻されます)。
C++11 はアトミック インクリメントを提供すると私は信じています。また、ほとんどのベンダー コンパイラには、特定の組み込み整数型 (通常は int と long) のアトミック インクリメントを引き起こす慣用的な方法があります。コンパイラのリファレンス マニュアルを参照してください。
「大きな値」(多倍長整数など) をインクリメントする場合は、セマフォなどの標準的なロック メカニズムを使用して行う必要があります。
アトミック読み取りについても心配する必要があることに注意してください。x86 では、32 ビットまたは 64 ビットの値の読み取りは、64 ビット ワードでアライメントされている場合、たまたまアトミックになります。「大きな値」には当てはまりません。ここでも、標準的なロックが必要になります。