Карточка 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 ошибок.

Термины по теме