Java の volatile とは異なり、.NET の volatile では、別の場所からの後続の volatile 読み取りを使用して、volatile 書き込みの順序を変更できることが知られています。問題 MemoryBarier
がある場合は、それらの間に配置することをお勧めします。またはInterlocked.Exchange
、揮発性書き込みの代わりに使用できます。
機能しますがMemoryBarier
、高度に最適化されたロックフリー コードで使用すると、パフォーマンスが低下する可能性があります。
少し考えて、ある考えに至りました。私が正しい道を歩んだかどうか、誰かに教えてもらいたい。
したがって、アイデアは次のとおりです。
これら 2 つのアクセス間での並べ替えを防止したいと考えています。
volatile1 write
volatile2 read
.NET MM から、次のことがわかります。
1) writes to a variable cannot be reordered with a following read from
the same variable
2) no volatile accesses can be eliminated
3) no memory accesses can be reordered with a previous volatile read
書き込みと読み取りの間の不要な並べ替えを防ぐために、書き込み先の変数からダミーの volatile 読み取りを導入します。
A) volatile1 write
B) volatile1 read [to a visible (accessible | potentially shared) location]
C) volatile2 read
このような場合、両方が同じ変数にアクセスするため、 B を A で並べ替えることができず、 CをBで並べ替えることができません。これは、2 つの揮発性読み取りを相互に並べ替えることができず、推移的にCをAで並べ替えることができないため です。
そして質問:
私は正しいですか?そのダミーの揮発性読み取りを、そのようなシナリオの軽量メモリバリアとして使用できますか?