2

ロックを必要とせずに、2 つのバイト配列をアトミックにスワップしたい。つまりやりたくない

    byte[] src;
    byte[] dest;
    lock(synchLock)
    {

       dest = src;
    }

これは Interlocked.Exchange で可能ですか? ドキュメントの int 配列で機能することがわかります。

ありがとう!

4

3 に答える 3

3

配列参照を交換するか、それらの要素を交換しますか? 参照 - はい、要素 - いいえ。配列を操作するアトミック コマンドはありません。

于 2011-05-07T00:00:36.810 に答える
1

はい、Interlocked.Exchangeすべての参照型といくつかの選択された値の型 (Int32/64/Ptr、Single、Double) をサポートしています。

于 2011-05-07T00:06:33.130 に答える
1

何を求めているのかは明確ではありませんが、InterlockedExchangeアトミックに次のことを行います。

  1. 変数の既存の値を読み取ります
  2. 変数を書き込みます

2 つの一時変数 (書き込まれる値と返される前の値) とともに、1 つの変数のみが操作に関与することに注意してください。一方、「スワップ」は通常、2 つの変数を書き込むことを意味し、それぞれがもう一方の変数に既に存在する値を持つようにします。それは次のようになります。

byte[] src;
byte[] dest;
lock(synchLock)
{
   var temp = dest;
   dest = src;
   src = temp;
}

InterlockedExchange両方の変数にアトミックな効果を持つロックレス スワップを実装するために使用することはできません。

于 2011-05-07T00:48:58.387 に答える