2011-06-29 5 views
6

volatileキーワードには、副作用を他のスレッドに表示するためのセマンティクスがリリース/取得されています(の変数を含む)。変数! iは定期的に、非揮発性の変数であることをリリース/獲得セマンティクスを持つvolatile

int i; 
volatile int v; 

注:例えば、これらの2つの変数を、取ります。次の文実行中のスレッド1を想像してみて:Javaのメモリモデル、スレッド1でvの書き込みによると

int some_local_variable = v; 
print(i); 

:時間内にいくつかの後の時点で

i = 42; 
v = 0; 

を、スレッド2は、次のステートメントを実行します続いてスレッド2のvを読み取ると、スレッド2はスレッド1で実行されたiへの書き込みを認識し、値42が出力されます。

私の質問は:volatileはC#で同じリリース/獲得セマンティクスを持っていますか?

+1

正確ではありません。 http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspxを参照してください。 –

答えて

14

C#の "volatile"のセマンティクスは、仕様のセクション3.10と10.4.3で定義されています。ここでそれらを再現するのではなく、スペックでそれを調べ、 "揮発性"を使用するのは複雑すぎると危険であると判断し、ロックを使用することに戻ります。それは私がいつもしていることです。

3.10 Execution Orderおよび10.4.3 Volatile Fieldsの仕様を参照してください。

+0

"複雑で危険な"細部からC++プログラマーを恥ずかしそうにしようとしているのですが、逆の効果が出るでしょう; – fredoverflow

+0

@Fred複雑で危険なので揮発性に興味がありますか? –

+1

@David:私は単に不正確な知識が嫌いです。私の印象は、「揮発性」は最も誤解されたキーワードの1つです。私は物事の仕組みを知りたい、それはすべてです:) – fredoverflow

6

まあ、私はそれがsome_local_variable場合は(による書き込みにvに)0として読み込まれ、iはトリッキーな部分が時間内にいくつかの後の時点で、」ある42

として読まされることを保証すると信じて"一般的に、ボラティリティは「フラッシング」の観点から言われていますが、それは実際に仕様(JavaまたはC#のいずれか)で定義されているわけではありません。

C#4言語仕様、セクション10.5.3から非揮発性フィールドについて

、命令の順序を変更する最適化技術は、同期せずにフィールドにアクセスするマルチスレッドプログラムにおける予期しないと予期しない結果につながる可能性lock-statement(8.12)によって提供されるようなものです。これらの最適化は、コンパイラ、実行時システム、またはハードウェアによって実行できます。揮発性フィールドの場合、そのような並べ替えの最適化は制限されます。

  • 揮発性フィールドの読み取りは揮発性読み取りと呼ばれます。揮発性読み取りには「セマンティクス取得」があります。つまり、命令シーケンスの後で発生するメモリへの参照より前に発生することが保証されます。
  • 揮発性フィールドの書き込みは、揮発性書き込みと呼ばれます。揮発性書き込みには「リリースセマンティクス」があります。つまり、命令シーケンスの書込み命令の前にメモリ参照があった後に発生することが保証されます。

は、揮発性変数から読み出した値にかなりあなたに似ていますが、条件付きである例があります。

そして、エリックのように、私は強く自分自身に頼るのを強く避けたいと思います。世界のジョー・ダフィー/スティーブン・トゥーブには、理性的に、そして最高のままにしておくのは難しい。

+0

具体的な意味を教えてくださいJavaの "フラッシング"書き込みに関しては?私のコードがJavaで動作しないことを意味していますか? – fredoverflow

+0

@Fredもし私たちがJonの小さな見積もりを信じていれば、C#は書き込みのセマンティクスを保証し、読み込みのセマンティクスを保証するように思えます。これは、例がJavaとC#の両方で正常に動作することを意味します。重要なセクションを読んでいくつかのコーナーケースを見逃してはいけません。そして、私は揮発性(そしてセマ​​フォーやそれ以外の低レベルのスレッディングに関するもの)を避けることは一般的に悪い考えではないことを完全に理解することができますが、私も知っています。あなたがする必要があることを意味しない! – Voo

+0

@Fred:問題は、「しばらくする」という意味を定義していないことです。あなたが保証できるのは、*スレッド2がvolatile変数への書き込みを見るならば、それは*不揮発性変数への書き込みも見るでしょう。 –

関連する問題