Карточка Senior Потоки и синхронизация обновлено
CompareExchange и lock-free обновление
Вопрос
Как атомарно обновить значение по сложному правилу без lock?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
Цикл CAS:
Ответ
Цикл CAS:
int seen, next;
do
{
seen = _max;
next = Math.Max(seen, value);
} while (Interlocked.CompareExchange(ref _max, next, seen) != seen);
Разбор
CompareExchange записывает новое значение, только если текущее равно ожидаемому, и возвращает старое. Если другой поток успел изменить поле, цикл повторяется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.