首先是使用中断实现信号量
class semaphore{
int value;
public:
p(){
disableInterrupts();
//loop until value is position
while(value==0){
enableInterrupts();//let interrupts occur
disableInterrupts();//disable them again;
}
value--;
enableInterrupts();
};
V(){
disableInterrupts();
value++;
enableInterrupts();
};
}
使用TS指令实现二值信号量
这里是TS指令的代码
boolean Test_and_Set( boolean memory[m] )
{ [
if( memory[m] ) // lock denied
return True;
else { // lock granted
memory[m] = True;
return False;
}
]
}
boolean s=false;
...
while(TS(s));//P(S)
<critical section>
s=FALSE;V(S)
...
TS指令实现通用信号量
struct semaphore {
int value = <initial value>;//表示通用信号量的值
boolean mutex = FALSE;//实现互斥
boolean hold = TRUE;//实现信号量对进程的阻塞
};
shared struct semaphore s;
/* P() */
P(struct semaphore s) {
while(TS(s.mutex)); /* wait for intertal mutex */
s.value--;
if(s.value < 0) {
s.mutex = FALSE;
SIGNAL(s.m);
while(TS(s.hold)); /* wait - too many out */
}
else
s.mutex = FALSE;
SIGNAL(s.m);
}
/* V() */
V(struct semaphore s) {
while(TS(s.mutex)); /* wait for intertal mutex */
s.value++;
if(s.value <= 0) {
while(!s.hold);//可能出现一种竞争情形,其中一个进程认为它在P操作中被阻塞,而在V操作过程中s.hold已经被设置设置成TRUE的情况,当在任一进程执行 //P操作之前,某个进程进行连续V操作时,就会发生这种情形。如果没有while语句,某个V操作的结果会丢失。
s.hold = FALSE;
}
s.mutex = FALSE;
}