ロックを必要とせずに、2 つのバイト配列をアトミックにスワップしたい。つまりやりたくない
byte[] src;
byte[] dest;
lock(synchLock)
{
dest = src;
}
これは Interlocked.Exchange で可能ですか? ドキュメントの int 配列で機能することがわかります。
ありがとう!
ロックを必要とせずに、2 つのバイト配列をアトミックにスワップしたい。つまりやりたくない
byte[] src;
byte[] dest;
lock(synchLock)
{
dest = src;
}
これは Interlocked.Exchange で可能ですか? ドキュメントの int 配列で機能することがわかります。
ありがとう!
配列参照を交換するか、それらの要素を交換しますか? 参照 - はい、要素 - いいえ。配列を操作するアトミック コマンドはありません。
はい、Interlocked.Exchange
すべての参照型といくつかの選択された値の型 (Int32/64/Ptr、Single、Double) をサポートしています。
何を求めているのかは明確ではありませんが、InterlockedExchange
アトミックに次のことを行います。
2 つの一時変数 (書き込まれる値と返される前の値) とともに、1 つの変数のみが操作に関与することに注意してください。一方、「スワップ」は通常、2 つの変数を書き込むことを意味し、それぞれがもう一方の変数に既に存在する値を持つようにします。それは次のようになります。
byte[] src;
byte[] dest;
lock(synchLock)
{
var temp = dest;
dest = src;
src = temp;
}
InterlockedExchange
両方の変数にアトミックな効果を持つロックレス スワップを実装するために使用することはできません。