このコードは 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--;
. それが機能する場合、それはアトミックな操作である必要があります。実際にそれがアトミック操作であることをどのように知ることができますか? 最新のCPUは、整列されたメモリ操作(ワード/ダブルワード/クワッドワード-依存)がアトミックであることを保証していることを知っています。しかし、ここでは、なぜそれがアトミックなのか確信が持てません。