28

Interlocked.Exchangeとはどう違いVolatile.Writeますか?

どちらのメソッドも、変数の値を更新します。誰かがそれぞれをいつ使用するかを要約できますか?

特にdouble、配列のアイテムを更新する必要があり、別のスレッドに最新の値を表示させたいと考えています。何が好ましいですか?Interlocked.Exchange(ref arr[3], myValue)またはVolatile.Write(ref arr[3], info);どこarrで宣言されていdoubleますか?


実際の例では、次doubleのように配列を宣言します。

private double[] _cachedProduct;

あるスレッドで、次のように更新します。

_cachedProduct[instrumentId] = calcValue;
//...
are.Set();

別のスレッドで、この配列を次のように読みました。

while(true)
{
    are.WaitOne();
    //...
    result += _cachedProduct[instrumentId];
    //...
}

私にとっては、そのままで問題なく動作します。ただし、「常に機能する」ことを確認するには、またはのいずれかを追加するVolatile.Write必要がありInterlocked.Exchangeます。二重更新はアトミックであることが保証されていないためです。

この質問への回答では、VolatileInterlockedクラスの詳細な比較を見たいと思います。なぜ2つのクラスが必要なのですか? どちらをいつ使用するのですか?


運用中のプロジェクトでのロック メカニズムの実装からの別の例:

private int _guard = 0;

public bool Acquire() => Interlocked.CompareExchange(ref _guard, 1, 0) == 0;

public void Release1() => Interlocked.Exchange(ref _guard, 0);
public void Release2() => Volatile.Write(ref _guard, 0);

この API のユーザーがRelease1またはRelease2メソッドを呼び出した場合、実質的な違いはありますか?

4

2 に答える 2

11

Interlocked.Exchangeは、アトミック操作を保証するプロセッサ命令を使用します。

Volatile.Writeも同じことをしますが、メモリバリア操作も含まれています。Microsoftは、Windows 8でARMプロセッサをサポートしているため、DotNet 4.5にVolatile.Writeを追加したと思います。IntelプロセッサとARMプロセッサは、メモリ操作の並べ替えが異なります。

Intelでは、メモリアクセス操作が発行されたのと同じ順序で実行されること、または少なくとも書き込み操作が並べ替えられないことが保証されています。

インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル、第8章から:

8.2.2P6および最近のプロセッサフ​​ァミリでのメモリの順序付けIntelCore2 Duo、Intel Atom、Intel Core Duo、Pentium 4、およびP6ファミリのプロセッサも、「書き込み」としてさらに定義できるプロセッサ順序付けのメモリ順序付けモデルを使用します。ストアバッファ転送で注文しました。」このモデルは、次のように特徴付けることができます。

ARMでは、この種の保証がないため、メモリバリアが必要です。これを説明するARMブログはここにあります:http://blogs.arm.com/software-enablement/594-memory-access-ordering-part-3-memory-access-ordering-in-the-arm-architecture/

あなたの例では、doubleを使用した操作はアトミックであることが保証されていないため、アクセスするにはロックをお勧めします。値を読み取って設定するときは、コードの両方の部分でロックを使用する必要があることに注意してください。

これらの値が設定された後に何が起こるかは明確ではないため、より完全な例があなたの質問に答えるのに適しています。ベクターの場合、ライターよりもリーダーが多い場合は、ReaderWriterLockSlimオブジェクトの使用を検討してください:http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

スレッドの数と読み取り/書き込みの頻度によって、ロック戦略が大幅に変わる可能性があります。

于 2012-09-19T11:59:51.627 に答える