次のようなコードのクラスがあります
private readonly object m_lock = new object();
private IClient m_client
private object m_context;
クライアントとコンテキストを設定するとき、私は次のようにロックします
lock(m_lock)
{
m_client = theClientFromSomewhere;
m_context = contextObject;
}
私の質問は、私m_client
がそれ自体を取得する必要があるだけの場合、これを行うのは安全ですか?
var localClient = m_client;
Debug.Assert(localClient != null);
localClient.DoStuff();
m_client
は参照型であるため、読み取り(に割り当てる場合localClient
)はアトミックであることが保証されているため、これは単一のCPUで正常に機能するはずです。
私は(理論的にも)m_client
変数volatile
を作成できます。これは、他のCPUによる順不同の読み取りを防ぐことで、複数のCPU間で安全になりますが、問題は、書き込み時のロックにより、書き込みなしで安全に読み取ることができるかどうかです。揮発性ですか?
CPUキャッシュを「フラッシュ」するときにロックして、読み取りを行うときに順序が狂わないようにしますか?