Может ли Interlocked.Exchange обмениваться двухбайтовыми [] массивами?

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

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

       dest = src;
    }

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

Спасибо!

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам