Un spin-lock es el cerrojo de sincronización más simple que existe: en lugar de dormir y ceder el control al planificador del sistema, el hilo que lo espera permanece en la CPU girando en un bucle vacío. Esto evita llamadas al sistema y cambios de contexto, a cambio de quemar tiempo de procesador. El artículo muestra cómo, partiendo de una implementación naive basada en un std::atomic_bool y un exchange en bucle, se puede llegar a una versión 5,7 veces más rápida que consume 5,4 veces menos energía.
La metodología es experimental: se ejecuta un benchmark con hasta cuatro hilos que incrementan un contador compartido, con cerrojo y contador cada uno en su propia línea de caché e hilos fijados a núcleos concretos. La versión inicial tarda 3,14 ns sin contención, pero se desploma con dos hilos (61,5 ns) y cuatro (246 ns), con tasas de fallos en caché L1 de datos del 61,73 % y un 12,52 % de ramas mal predichas.
La primera optimización sustituye la semántica seq_cst por acquire en lock y release en unlock, lo que permite que unlock pase de ser una operación atómica de lectura-modificación-escritura a un simple store. Con cuatro hilos el tiempo baja a 131 ns y el consumo energético cae de 64,92 J a 34,45 J.
La segunda añade el patrón test-and-test-and-set con la instrucción _mm_pause, de modo que tras un intento fallido los hilos hacen lecturas sin escritura sobre el cerrojo. Esto reduce las escrituras redundantes y mejora la predicción de saltos.
La tercera aplica backoff exponencial documentado por Intel, duplicando el número de pausas por ronda hasta un tope de 64, lo que desincroniza a los hilos que esperan y deja el rendimiento en 43 ns con cuatro hilos. Cada paso se acompaña de datos de rendimiento con Google Benchmark y de contadores de hardware medidos con perf.
