私が(ロックのような)他の手段でvolatile
の交換についての質問ではないのです注意してください、私は約volatile
自然を求めています - ので、私は、ある意味でvolatile
あるいは全くvolatile
を「必要ない」を使用します。間接アクセスで揮発性が必要ですか?
1つのスレッドが変数x
(Int32
)にのみ書き込みを行い、もう1つのスレッドがそれを読み込む場合を考えてみましょう。両方の場合のアクセスは直接的です。
キャッシングを避けるには、volatile
が必要ですか?
しかしx
へのアクセスが間接的であればどのような - 例えばプロパティ経由:
int x;
int access_x { get { return x; } set { x = value; } }
だから、両方のスレッドが今だけaccess_x
、ないx
を使用しています。 x
はvolatile
とマークする必要がありますか?はいの場合は、volatile
が不要になったときに間接的に制限がありますか?
更新は:リーダー(なし書き込み)のようなコードを考えてみます。x
がキャッシュ内にあり、volatile
ずにそこにある可能性があるため、第二if
コンパイラで
if (x>10)
...
// second thread changes `x`
if (x>10)
...
がは古い値を使用して評価することができ再取得する必要はありません。
if (access_x>10)
...
// second thread changes `x`
if (access_x>10)
...
との私はx
ためvolatile
をスキップしましょう:私の質問は、このような変更についてです。何が起こるか/何が起こることができますか?
一般的に、volatileで始めるのは嫌です。この場合、プロパティは何も変更されません。 – Karolis
プロパティを追加しても、「間接」の読み書きは行われません。これは単に 'x'に関係するコードの部分を変更します。言い換えれば、*プロパティなしの 'x' *の古くなった値を受け取るつもりならば、プロパティゲッターのコードは' x'の失効した値を受け取るでしょう。 – Rob
@Rob、ありがとうございますが、私はあなたの最初の文を理解していません。 'x = 7'と書いてください。これは直接割り当てです。私は 'setFoo()'を呼び出して 'setBar()'を呼び出し、 'setMe()'を呼び出して 'setX()'を呼び出すと、それはプロパティセッターを呼びます。だからなぜあなたは間接的にプロパティを数えないのですか? – astrowalker