Compare-and-swap (CAS) es una instrucción atómica de bajo nivel utilizada en computación concurrente para implementar primitivas de sincronización sin bloqueos (lock-free). La operación CAS toma tres operandos: una ubicación de memoria (dirección), un valor esperado y un nuevo valor. Ejecuta la siguiente lógica de forma atómica: si el valor actual en la ubicación de memoria es igual al valor esperado, entonces la ubicación se actualiza con el nuevo valor. La operación devuelve un booleano indicando si el intercambio se realizó con éxito (es decir, si el valor actual coincidía con el esperado). Esta atomicidad es crucial para evitar condiciones de carrera en entornos multi-hilo o multi-proceso.
CAS es una instrucción fundamental presente en la mayoría de las arquitecturas de CPU modernas (x86, ARM, PowerPC) y es la base para construir estructuras de datos concurrentes y algoritmos sin bloqueos. Por ejemplo, es utilizada extensivamente en la implementación de `std::atomic` en C++ y en las clases `java.util.concurrent.atomic` de Java, como `AtomicReference` o `AtomicLong`. Sistemas operativos y bases de datos también la emplean para gestionar estructuras de datos internas, como listas enlazadas o colas, de forma concurrente. Un caso de uso común es la implementación de un spinlock o la actualización de un contador compartido de forma segura sin necesidad de un mutex pesado.
Para un arquitecto de sistemas, entender CAS es vital para diseñar sistemas de alto rendimiento y baja latencia. Permite la creación de algoritmos lock-free y wait-free, que pueden ofrecer ventajas significativas sobre los enfoques basados en bloqueos, como una mayor escalabilidad, menor contención y la eliminación de deadlocks y priority inversions. Sin embargo, su uso directo es complejo y propenso a errores; requiere un conocimiento profundo de la concurrencia y los "ABA problem". La decisión de utilizar primitivas basadas en CAS frente a bloqueos tradicionales implica un trade-off entre la complejidad de la implementación, el rendimiento bajo alta contención y la robustez. Un arquitecto debe evaluar si los beneficios de rendimiento de un enfoque lock-free justifican la complejidad adicional y el riesgo de errores sutiles, o si es preferible delegar esta complejidad a bibliotecas y frameworks bien probados que ya utilizan CAS internamente.