Tomar un semáforo debe ser atómico. ¿Lo es?

Este fragmento de código proviene de la fuente Pintos:https://www.cs.usfca.edu/~benson/cs326/pintos/pintos/src/threads/synch.c

void
sema_down (struct semaphore *sema) 
{
  enum intr_level old_level;

  ASSERT (sema != NULL);
  ASSERT (!intr_context ());

  old_level = intr_disable ();
  while (sema->value == 0) 
    {
      list_push_back (&sema->waiters, &thread_current ()->elem);
      thread_block ();
    }
  sema->value--;
  intr_set_level (old_level);
}

El hecho de tomar un semáforo essema->value--;. Si funciona, debe ser una operación atómica. ¿Cómo podemos saber que, de hecho, es una operación atómica? Sé que la CPU moderna garantiza que la operación de memoria alineada (para palabra / palabra doble / palabra cuádruple, depende) es atómica. Pero, aquí, no estoy convencido de por qué es atómico.

Respuestas a la pregunta(1)

Su respuesta a la pregunta