Patrones de comparación e intercambio (CAS)
Implemente actualizaciones sin bloqueos con compare_exchange_weak y compare_exchange_strong.
Patrones de comparación e intercambio (CAS) es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
La primitiva CAS
La comparación e intercambio lee, compara y escribe condicionalmente de forma atómica. Es la base de la mayoría de los algoritmos sin locks.
Compare exchange en C++
Dos variantes en std::atomic:
compare_exchange_strong(expected, desired)— tiene éxito cuando el valor actual es igual a expectedcompare_exchange_weak(expected, desired)— puede fallar espuriamente
Anatomía de un bucle CAS
El bucle CAS clásico: leer, calcular e intentar escribir. Reintente si otro hilo gana la carrera.
std::atomic<int> a{0};
int old = a.load();
int next;
do {
next = compute_new(old);
} while (!a.compare_exchange_weak(old, next));CAS para actualizaciones atómicas
Utilice CAS cuando el nuevo valor dependa del anterior. Un store simple perdería las actualizaciones de los hilos concurrentes.
// Atomic max
int current = a.load();
while (newval > current && !a.compare_exchange_weak(current, newval));Pila lock-free: push
Una operación push sencilla en una pila lock-free utiliza CAS para instalar un nodo nuevo en la cabeza.
struct Node { int value; Node* next; };
std::atomic<Node*> head{nullptr};
void push(int v) {
Node* n = new Node{v, nullptr};
n->next = head.load();
while (!head.compare_exchange_weak(n->next, n));
}Fallo espurio
compare_exchange_weak puede fallar incluso cuando los valores coinciden, en plataformas como ARM, donde la instrucción subyacente puede fallar. Utilícelo dentro de bucles; use strong cuando reintentar resulte costoso.
Patrón de actualización: reset
Restablezca un valor a un estado conocido solo si no ha cambiado.
int expected = 42;
if (a.compare_exchange_strong(expected, 0)) {
// a was 42 and is now 0
}Componente básico: contador atómico
Para un contador simple, fetch_add es más sencillo y rápido que un bucle CAS.
Componente básico: indicador atómico
Para un indicador booleano simple, std::atomic_flag es más ligero que std::atomic<bool> y admite test_and_set.
Razonar sobre la concurrencia
El código lock-free es famoso por ser difícil de analizar. Utilice pruebas rigurosas, como TSan y fuzzing, modelos formales cuando estén disponibles y, preferiblemente, implementaciones existentes y probadas en batalla.
Cuándo elegir CAS
Utilice CAS cuando:
- Varios hilos actualicen con frecuencia el mismo valor
- Los mutexes muestren la contención como un cuello de botella
- La sección crítica sea muy breve y sencilla
Cuándo no utilizar CAS
Evite CAS cuando:
- La actualización necesite más de un par de operaciones
- La corrección sea más importante que el rendimiento
- El equipo carezca de experiencia en programación lock-free
Comprobación rápida
¿Por qué solemos utilizar compare_exchange_weak dentro de un bucle?
Resumen
La comparación e intercambio actualiza un valor atómicamente solo si es igual al valor esperado. Los bucles CAS gestionan las actualizaciones concurrentes sin locks. Utilice compare_exchange_weak dentro de los bucles y strong para intentos únicos.
Aprende C++ con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 51
- Lecciones
- 203
Preguntas frecuentes
¿La lección «Patrones de comparación e intercambio (CAS)» es gratis?
Sí — el texto completo de «Patrones de comparación e intercambio (CAS)» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Patrones de comparación e intercambio (CAS)»?
Implemente actualizaciones sin bloqueos con compare_exchange_weak y compare_exchange_strong. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Patrones de comparación e intercambio (CAS)»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- std::atomic y órdenes de memoria
- Patrones de comparación e intercambio (CAS)
- Implementación de una cola sin bloqueos
- Punteros de peligro y el problema ABA