質問

複数のスレッドからチャー/整数内にビットを設定しようとしているかどうかを知りたいのですが、変更は失われますか?私は最初にすべてのゼロを持ち、スレッドはそれを1にのみ設定します。システムアーキテクチャはx64です。

ありがとう、ゴクル。

役に立ちましたか?

解決

X64(およびX86)では、INTの操作はアトミックです。これは、読み取りと書き込みが独立して原子的であり、組み合わせたものではないことを意味します。 (たとえば、2つのスレッドが同時にINTを書いている場合、1つの半分と半分の半分が他の1つを表示することはありません。

ただし、読み書きは2つの別々の操作です。連動する操作を実行できます(読み取りと書き込みを1つの原子操作にします)が、ビットワイズロジックがこの方法で実行できる操作のセットに分類されるとは思いません。

この操作をアトミックにしたい場合は、いくつかのMutex/Monitorをロックし、読み取り/書き込みを実行する必要があると思います。

他のヒント

ミューテックスまたは同様の同期メカニズム、または原子操作のいずれかを使用する必要があります。前者については、POSIXとWindowsライブラリがすぐに利用でき、非常に標準あります。後者の場合、ほとんどのコンパイラはいくつかの機能を提供します(例: http://gcc.gnu.org/wiki/atomic)、インラインアセンブリモードまたはそれらを使用するその他の便利な方法で、いつでもアセンブリ言語からコンパイルされたオブジェクトにリンクするために戻ることができます。

あなたは間違いなくそのような明示的な同期を避けることはできません。 XORがCPUコアの最も内側のメモリキャッシュの値で何らかの形で直接的かつ原子的に動作したとしても(これはそうではありません)、値が他のCPUコアのキャッシュと同期されることを保証する必要があります。 Cachesを明示的に同期するCPUの指示のみが役立ちます - 上記のライブラリオプションのいずれかを使用してそれらを使用するのが最も簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top