Может ли Interlocked.Exchange обмениваться двухбайтовыми [] массивами? - PullRequest
2 голосов
/ 07 мая 2011

Я хочу поменять местами двухбайтовые массивы без необходимости замок. то есть я не хочу сделать

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

       dest = src;
    }

Возможно ли это с Interlocked.Exchange? Я вижу, что это работает для массивов int в документах.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

Поменять местами ссылки на массивы или поменять их элементами? Рекомендации - да, элементов - нет. Нет атомарной команды, которая работает с массивами.

1 голос
/ 07 мая 2011

Не понятно, о чем вы спрашиваете, но InterlockedExchange атомарно делает следующее:

  1. читает ранее существующее значение переменной
  2. записывает переменную

Обратите внимание, что в операции участвует только одна переменная, а также два временных значения (записываемое значение и возвращаемое предыдущее значение). Тогда как «своп» обычно означает запись двух переменных, каждая из которых имеет значение, которое ранее существовало в другой. Это было бы:

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

InterlockedExchange нельзя использовать для реализации без блокировки блокировки с атомарным эффектом для обеих переменных.

1 голос
/ 07 мая 2011

Да, Interlocked.Exchange поддерживает все ссылочные типы и несколько выбранных типов значений (Int32 / 64 / Ptr, Single, Double).

...