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; }
ここをいじるの部分をいじれば実験できると思う。