Этот фрагмент кода исходит от источника 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);
}
Факт принятия семафора sema->value--;. Если он работает, это должна быть атомная операция.
Как мы можем знать, что это атомная операция? Я знаю, что современный процессор гарантирует, что операция с совмещенной памятью (для слова/двойного слова/квад-слова - это зависит от) - атомарная. Но здесь я не уверен, почему он атомный.
