Вопрос проверяет понимание атомарной операции Compare-And-Swap, используемой для реализации неблокирующих алгоритмов и синхронизации в многопоточном программировании.
Compare-And-Swap (CAS) — это атомарная инструкция, которая выполняет три шага: читает значение из памяти, сравнивает его с ожидаемым значением и, если они совпадают, записывает новое значение. Вся операция выполняется как единое неделимое действие, что гарантирует потокобезопасность без использования блокировок.
CAS принимает три параметра: адрес памяти, ожидаемое старое значение и новое значение. Если текущее значение по адресу равно ожидаемому, оно заменяется на новое, и операция возвращает true. В противном случае ничего не меняется, и возвращается false. Это позволяет реализовать оптимистичные алгоритмы, где потоки пытаются выполнить операцию и повторяют попытку при неудаче.
#include <atomic>
#include <iostream>
std::atomic<int> counter(0);
void increment() {
int expected = counter.load();
while (!counter.compare_exchange_weak(expected, expected + 1)) {
// expected обновляется автоматически при неудаче
}
}
int main() {
increment();
std::cout << counter.load(); // 1
return 0;
}CAS — ключевой механизм для построения эффективных и масштабируемых многопоточных приложений, где важна производительность и минимизация блокировок. Его стоит применять в системах с высокой конкуренцией, где традиционные блокировки создают узкие места.