set-and-test

これ何のことだか分かる人は勘が良い(もしくは頭が良い)
セマフォを割込み禁止領域で実現するのではなくてset-and-test命令で実現すべく実験。
Intel系CPUではcmpxchgを用いれば良いようだ。

cmpxchg
( オペランドのサイズに従って) AL、AX、またはEAX レジスタの値を第1 オペランド( デス
ティネーション・オペランド) と比較する。2 つの値が等しい場合は、第2 オペランド( ソー
ス・オペランド) がデスティネーション・オペランドにロードされる。等しくない場合は、デ
スティネーション・オペランドがAL、AX、またはEAX レジスタにロードされる。


というわけで実験・実験 hige.cとgccを用意して gcc hige.c ⇒./a.exe(もしくはa.out)

#include <stdio.h>

#define LOCKED   1
#define UNLOCKED 0

int main()
{
    int state = UNLOCKED;//ここをいじる
    int result;

    asm volatile("movl    $0,    %%eax \n"
                 "movl    $%c1,  %%ecx \n"
                 "cmpxchg %%ecx, %2    \n"
                 "movl    %%eax, %0    \n"
                 : "=m"(result) : "g"(LOCKED), "m"(state) : "eax", "ecx");


    printf("lock %s state=%s\n", result == 0 ? "OK" : "NG", state == LOCKED ? "LOCKED" : "UNLOCKED");

    return 0;
}


ここをいじるの部分をいじれば実験できると思う。