me gusta pensar de sincronización de subprocesos como de abajo hacia arriba, donde el procesador y el sistema operativo proporcionan constructo que son primitivos a más sofisticado
A nivel procesador que tiene CAS y LL/SC que le permiten realizar una prueba y almacena en una sola operación atómica ... también tienes otras construcciones de procesador que te permiten deshabilitar y habilitar la interrupción (sin embargo se consideran peligrosas ... en ciertas circunstancias no tienes otra opción que usarlas)
El sistema operativo
proporciona la capacidad de cambiar de contexto entre las tareas que pueden suceder cada vez que un subproceso ha utilizado su intervalo de tiempo ... o puede suceder por otros motivos (voy a llegar a eso)
luego hay construcciones de alto nivel como mutexes que utiliza estos mecanismos primitivos proporcionados por el procesador (creo que gira el mutex) ... que esperará continuamente por la condición para convertirse en verdadera y controles para que la condición atómicamente
entonces estos mutex hilado puede usar la funcionalidad proporcionada por el sistema operativo (cambio de contexto y el sistema de llamadas como rendimiento, que se renuncia al control a otro hilo) y nos da mutexes
estas construcciones se utilizan además por constructos de nivel superior como variables condicionales (que pueden hacer un seguimiento de cuántos hilos están esperando el mutex y que rosca para permitir primero cuando el mutex esté disponible)
Estas construcciones que se pueden utilizar además para proporcionar sincronización más sofisticado construye ... ejemplo: semáforos, etc.
Para extender este, CAS y operaciones similares son utilizado para implementar la sincronización porque las CPU están específicamente diseñadas para que sean operaciones * atómicas *: hacen todo en un solo paso, sin que ninguna otra operación pueda interrumpirlas. – Amber
Nota: Como ** John Knoeller ** ha señalado, 'xchg' implica un * lock * que comienza con el 80386 - el prefijo está escrito en la mayoría de las muestras para mayor claridad (que creo que es una buena práctica), no por necesidad . Esto no es cierto para los demás, p. 'cmpxchg'.Por lo tanto, creo que es más seguro especificar siempre explícitamente el prefijo cuando pretenda obtener acceso exclusivo a la memoria. –