並行プログラミングに関する Joe Duffy の本を読んでいます。ロックレススレッドについて学術的な質問があります。
最初に: ロックレス スレッドには危険が伴うことは知っています (信じられない場合は、メモリ モデルに関する本のセクションを読んでください)。
それにもかかわらず、質問があります。int プロパティを持つクラスがあるとします。
このプロパティによって参照される値は、複数のスレッドによって非常に頻繁に読み取られます
値が変更されることは非常にまれであり、変更される場合は単一のスレッドで変更されます。
それを使用する別の操作が進行中に変更された場合、誰も指を失うことはありません (それを使用する人が最初に行うことは、それをローカル変数にコピーすることです)。
ロックを使用できます (または、readerwriterlockslim を使用して同時読み取りを維持します)。変数 volatile をマークすることができます (これが行われる多くの例)
ただし、揮発性であっても、パフォーマンスに影響を与える可能性があります。
変更時に VolatileWrite を使用し、読み取りの場合は通常のアクセスのままにするとどうなりますか。このようなもの:
public class MyClass
{
private int _TheProperty;
internal int TheProperty
{
get { return _TheProperty; }
set { System.Threading.Thread.VolatileWrite(ref _TheProperty, value); }
}
}
実生活でこれを試すことはないと思いますが、答えに興味があります(何よりも、読んできたメモリモデルの内容を理解しているかどうかのチェックポイントとして)。