0

複数のスレッドから char/integer 内のビットを設定しようとすると、変更が失われますか? 最初はすべてゼロで、スレッドはそれを 1 に設定するだけです。システム アーキテクチャは x64 です。

ありがとう、ゴクル。

4

2 に答える 2

3

x64 (および x86) では、int に対する操作はアトミックです。これは、読み取りと書き込みが組み合わせではなく、独立してアトミックであることを意味します。(たとえば、2 つのスレッドが同時に int を書き込んでいる場合、一方の半分ともう一方の半分は表示されません。常に一方が完全な整数か他方が表示されます。)

ただし、読み取りと書き込みは 2 つの別個の操作です。連動していくつかの操作を実行できます (読み取りと書き込みが 1 つのアトミック操作になります) が、ビット単位のロジックがこの方法で実行できる一連の操作に該当するとは思いません。

この操作をアトミックにしたい場合は、ミューテックス/モニターをロックして読み取り/書き込みを実行する必要があると思います。

于 2010-11-09T05:37:43.553 に答える
1

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

このような明示的な同期を避けることは絶対にできません。XOR が何らかの方法で CPU コアの最内メモリ キャッシュの値に対して直接的かつアトミックに操作したとしても (そうではありません)、値が他の CPU コアのキャッシュと同期されていることを保証する必要があります。キャッシュを明示的に同期する CPU 命令のみが役に立ちます。上記のライブラリ オプションの 1 つを使用するのが最も簡単です。

于 2010-11-09T06:36:35.267 に答える