2015-01-14 10 views
5

VB.Netは、C#volatileキーワードの同等のものを持っていません。だから、このようなものは、C#の揮発性の変数を宣言することと等価である:VB.NET:私は常にThread.MemoryBarrier()と私の書き込みを完了した場合、それぞれが読む前に、私はThread.MemoryBarrier()を呼び出す必要がありますか?あなたが手動で通常の読み取り前と書き込み後Thread.MemoryBarrier()を呼び出すことによって行われている揮発性実装する必要がありますので

''' <summary> 
    ''' Gets a value indicating whether this instance is disposed. 
    ''' </summary> 
    Public Property IsDisposed As Boolean 
     Get 
      Threading.Thread.MemoryBarrier() 
      Return _isDisposed 
     End Get 
     Private Set(value As Boolean) 
      _isDisposed = value 
      Threading.Thread.MemoryBarrier() 
     End Set 
    End Property 

私は変数に書き込む唯一の場所がセッターを介して行われた場合、読み取りが必要である前に、私は、メモリバリアの疑問に思って、そこに私はいつもスレッドを呼び出します.MemoryBarrier()は書き込み後に発生します。

読み込む前にThread.MemoryBarrier()を安全に削除できますか?

編集:より明確にするために、読み込みごとにメモリフェンスのコストを除去するために、読み込む前にThread.MemoryBarrier()を削除できるかどうかを尋ねています。

+2

[ 'Volatile'クラス(http://msdn.microsoft.com/en-us/library/system.threading.volatile:または、フィールドのラッパーとしてC#で記述された構造体を使用(V = vs.110は)の.aspx)VB.netで動作すべきであると 'Thread'クラスがhttp://msdn.microsoft.com/en-us/library/zdxzk5cw.aspx([' VolatileRead']のような方法が含まれてい) – CodesInChaos

+0

質問は読み込みのメモリフェンスの潜在的に不要なコストを回避するために、読み取り前に、私は無事Thread.MemoryBarrierを削除することができます()です。 –

+0

私はあなたがそれを取り除くと古い読書を得ることができると確信しています。 – CodesInChaos

答えて

2

読み取り側のバリアを削除することはできませんが、これは例によって簡単です。のは、このリーダーを使ってみましょう:

while (!IsDisposed); //reads _isDisposed 

新しい書き込みが目に見えるようになることは決してありませんように_isDisposedの値は明らかにここにレジスタにキャッシュすることができます。このループは無限大になる可能性があります(例えば、長い遅延のような他の効果が可能です)。

さらに正式には、_isDisposedの読み取りは、すべて「上向き」に移動して、ストアが実行される前に実行されるように表示されます。 volatileには、後でその上に何も移動できないことを意味するリリースフェンスが格納されます。しかし、物事は以前の時点に移動することができます。

Volatileクラスを使用してください。

struct VolatileInt32Box { public volatile int Value; } 
+0

ハンスアンパッサンが提案したように私はVolatileRead/VolatileWriteソリューションを使用します。何らかの理由でそれらの2つの方法がはるかに遅いです@ –

+0

@ dcarapicメソッド呼び出しをコンパイルします。彼らには欠点しかありません。 – usr

+0

Hans pasantによるとはありません(彼が提供したリンクhttp://stackoverflow.com/questions/27468923/best-way-to-implement-thread-safe-atomic-accessors-of-a-long-property-on-a -guara/27469253#27469253)。今私はこれをテストしていませんが、C#のvolatileキーワードとVolatileWrite/VolatileReadは機能と速度が似ているはずです。 –

関連する問題