Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpCcCx 369 of 509 menu
◀ ▶

CompareExchange в C#

Метод Interlocked.CompareExchange (ref location, newValue, comparand) записывает newValue только если location сейчас равен comparand; возвращает прежнее значение location до попытки обмена.

Так обновляют одно поле без блокировки. Если другой поток уже изменил поле, обмен не проходит: метод возвращает прежнее значение, и попытку повторяют.

Заменим 5 на 9, только пока в slot действительно 5. prev - это старое значение, slot уже стал 9. Если бы ожидаемым было 0, поле не изменилось бы: текущее значение с ним не совпало:

int slot = 5; int prev = Interlocked.CompareExchange(ref slot, 9, 5); Console.WriteLine(prev); // выведет 5 Console.WriteLine(slot); // выведет 9

Заведите поле со значением 0. Замените его на 5 только если сейчас там 0, и выведите итоговое значение.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить