9

Java では、揮発性としてマークされていない変数に複数のスレッドがアクセスしている場合、予期しない動作が発生する可能性があります。

例:

private boolean bExit;

 while(!bExit) {
    checkUserPosition();
    updateUserPosition();
 }

bExit 変数を voilatile としてマークすると、他のスレッドが最新の値を見ることが保証されます。

c# は同じように動作しますか?

アップデート

たとえば、C# では次のようにします。

int counter = ...;

for(...)
{
   new Thread(delegate()
   {

      Interlocked.Decrement(ref counter);
   }
}


if(counter == 0) 
{
   // halt program
}

上記の C# では、カウンター変数を揮発性としてマークする必要がありますか?それとも期待どおりに機能しますか?

4

2 に答える 2

0

bExit 変数を voilatile としてマークすると、他のスレッドが最新の値を見ることが保証されます。c# は同じように動作しますか?


はい。ただし、共有変数へのアクセス方法にすべて依存します。あなたの例として、変数にスレッドセーフな方法でアクセスする場合、voilatileInterlocked.Decrementを使用しなくても問題になりません。

volatile(MSDN からの C# 参照)

volatile キーワードは、同時に実行されている複数のスレッドによってフィールドが変更される可能性があることを示します。volatile と宣言されたフィールドは、シングル スレッドによるアクセスを想定したコンパイラの最適化の対象ではありません。これにより、常に最新の値がフィールドに表示されます

「揮発性」キーワードは何に使用されますか?

于 2013-05-01T20:18:37.993 に答える