11

セクション5.5のC#仕様ではbool、特定の型(つまり、、、、、、、、、、、、、および参照型)の読み取りと書き込みはアトミックであることが保証されています。charbytesbyteshortushortuintintfloat

これは私の興味をそそりました。どうやってそれができる?つまり、個人的な経験では、読み取りと書き込みをアトミックに見せたい場合は、変数をロックするか、バリアを使用することしかできませんでした。読み取り/書き込みごとに実行する必要がある場合は、パフォーマンスが低下します。それでも、C#は同様の効果で何かをします。

おそらく他の言語(Javaなど)がそれを行います。真剣にわかりません。私の質問は、実際には言語固有のものではありません。C#がそれを実行していることを知っているだけです。

特定のプロセッサ命令を処理する必要があり、C /C++では使用できない可能性があることを理解しています。しかし、それでもどのように機能するのか知りたいです。

[編集]実を言うと、CPUがメモリ位置にアクセスしているときに、別のCPUがメモリ位置にアクセスするなど、特定の条件では読み取りと書き込みが非アトミックになる可能性があると私は信じていました。これは、CPUがすべてのオブジェクトを一度に処理できない場合にのみ発生しますか?たとえば、オブジェクトが大きすぎるため、またはメモリが適切な境界に配置されていないためですか?

4

5 に答える 5

16

これらの型が原子性を保証しているのは、それらがすべて 32 ビット以下であるためです。.NET は 32 ビットおよび 64 ビットのオペレーティング システムでのみ実行されるため、プロセッサ アーキテクチャは 1 回の操作で値全体を読み書きできます。これは、2 つの 32 ビット操作を使用して読み書きする必要がある 32 ビット プラットフォーム上の Int64 とは対照的です。

私はハードウェアの専門家ではないので、専門用語が道化師のように聞こえたら申し訳ありませんが、それが基本的な考え方です。

于 2010-01-16T07:39:44.877 に答える
5

CLR は 32 ビット以下の変数に対してのみ原子性を保証するため、x86 および x64 コアに原子性保証を実装するのはかなり安価です。必要なのは、変数が適切に配置されていて、キャッシュ ラインをまたがっていないことだけです。JIT コンパイラは、ローカル変数を 4 バイト アラインされたスタック オフセットに割り当てることで、これを保証します。GC ヒープ マネージャーは、ヒープ割り当てに対して同じことを行います。

注目すべきは、CLR 保証があまり良くないことです。アライメントの約束は、double の配列に対して一貫してパフォーマンスを発揮するコードを記述するには十分ではありません。このスレッドで非常にうまく実証されています。このため、SIMD 命令を使用するマシン コードとの相互運用も非常に困難です。

于 2010-01-16T13:09:05.540 に答える
4

とにかく、x86 では読み取りと書き込みはアトミックです。ハードウェア レベルでサポートされます。ただし、これは、加算や乗算などの操作がアトミックであることを意味するものではありません。読み込み、計算、保存を必要とするため、干渉する可能性があります。そこで、lock プレフィックスの出番です。

ロックとメモリバリアについて言及しました。読み取りと書き込みがアトミックであることとは何の関係もありません。x86 では、メモリ バリアを使用するかどうかに関係なく、半分書き込まれた 32 ビット値が表示されることはありません。

于 2010-01-16T07:39:04.347 に答える
3

はい、あなたが言うように、C# と Java は、いくつかのプリミティブ型のロードとストアがアトミックであることを保証します。.NET または JVM を実行できるプロセッサは、適切に整列されたプリミティブ型のロードとストアがアトミックであることを保証するため、これは安価です。

現在、C# も Java もプロセッサも保証されておらず、高価なものは、これらの変数をマルチスレッド プログラムでの同期に使用できるようにメモリ バリアを発行しています。ただし、Java と C# では、変数を「volatile」属性でマークすることができます。この場合、コンパイラは適切なメモリ バリアを発行します。

于 2010-01-16T18:53:54.960 に答える
-5

できません。アセンブリ言語に至るまで、別のコアやプロセスが発生してすべてのハードワークが一掃されないようにするために、特別なLOCKオペコードを使用する必要があります。

于 2010-01-16T06:52:33.597 に答える