Может ли Interlocked.Exchange обмениваться двухбайтовыми [] массивами?
Я хочу поменять местами два байтовых массива без необходимости блокировки. т.е. я не хочу делать
byte[] src;
byte[] dest;
lock(synchLock)
{
dest = src;
}
Это возможно с Interlocked.Exchange? Я вижу, что это работает для массивов int в документах.
Спасибо!
3 ответа
Не понятно, о чем ты спрашиваешь, но InterlockedExchange
атомарно делает следующее:
- читает ранее существующее значение переменной
- пишет переменную
Обратите внимание, что в операции участвует только одна переменная, а также два временных значения (записываемое значение и возвращаемое предыдущее значение). Тогда как "своп" обычно означает запись двух переменных, каждая из которых имеет значение, которое ранее существовало в другой. Это было бы:
byte[] src;
byte[] dest;
lock(synchLock)
{
var temp = dest;
dest = src;
src = temp;
}
InterlockedExchange
не может использоваться для реализации без блокировки блокировки с атомарным эффектом для обеих переменных.
Менять местами ссылки на массивы или менять их элементы? Рекомендации - да, элементов - нет. Там нет атомарной команды, которая работает с массивами.
Да, Interlocked.Exchange
поддерживает все ссылочные типы и несколько выбранных типов значений (Int32/64/Ptr, Single, Double).