📌 CAS
CAS (Compare-And-Swap) — атомарная операция, применяемая в многопоточных средах для синхронизации данных без использования Lock или Mutex. Используется в реализациях Spinlock, lock-free структур и протоколов.
🧠 Как работает
CAS принимает три аргумента:
- Адрес (memory location)
- Ожидаемое значение
- Новое значение
CAS сравнивает текущее значение по адресу с ожидаемым, и если они равны — заменяет его на новое. Всё происходит атомарно.
// Псевдокод
bool CAS(addr, expected, new) {
if (*addr == expected) {
*addr = new;
return true;
} else {
return false;
}
}На аппаратном уровне реализуется через:
-
Инструкции типа
CMPXCHG(x86),LDREX/STREX(ARM) -
CPU-поддержку атомарных операций и Memory barrier
Используется для:
-
Lock-free очередей и стеков
-
Reference counting без блокировок
⚙️ Где применяется
| Область | Назначение |
|---|---|
| Multicore CPU | Безопасный доступ к общей памяти |
| RTOS | Реализация fast-path без блокировок |
| Kernel | Управление состоянием процессов, TCB |
| User-space library | Реализация Mutex, Semaphore, Queue |
✅ Преимущества
-
Не требует блокировок
-
Высокая производительность при низком конфликте
-
Основа для lock-free и wait-free алгоритмов
❌ Недостатки
-
Требует циклического повторения при неудаче
-
ABA problem — значение может измениться и вернуться
-
Поддержка ограничена архитектурой