C++ Academy · Lección

Patrones de comparación e intercambio (CAS)

Implemente actualizaciones sin bloqueos con compare_exchange_weak y compare_exchange_strong.

Lección 2 de 414 pasos

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 expected
  • compare_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.

Gratis para empezar

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

  1. std::atomic y órdenes de memoria
  2. Patrones de comparación e intercambio (CAS)
  3. Implementación de una cola sin bloqueos
  4. Punteros de peligro y el problema ABA
← Volver a C++ Academy