如果Semaphore这样实现,就可能导致spinlock:
acquire(){ while(value <= 0) ; //no-op value--; } release(){ value++; }
当进程等待时,cpu会空转,也就是说进程会spin(自旋),导致CPU浪费。
所以应该改空转为阻塞,把cpu让给操作系统的scheduler. 恐龙书上介绍的实现为:
acquire(){ value--; if(value < 0){ add this process to list; block(); } } release(){ value++; if(value <= 0){ remove a process P from list wakeup(P); } }