1.以中断启用与禁止来实现锁
中断的启用和禁止是原子的,不能被其他代码插入的
lock(){
disable interrupt
while(value!=free){
enable interrupt
disable interrunpt //使其他线程可以抢占,从而改变value的值
}
value=busy
enable interrupt
}
2.以测试和设置指令来实现锁
原子操作:将内存指定位置对的存储单元读到一个寄存器,将新的值写到刚才的存储单元
test_and_set(x){
tmp=x;
x=1;
return (tmp);
}
value is initially 0
lock(){
while(test_and_lock(1)==1) {} //每次执行完原子操作后都有可能会被抢占
}
unlock(){
value=0; 因为是赋值0,可以直接在总线上产生,不用中断包裹着也没有问题
}
3 以非繁忙等待,中断启用和禁止来实现锁
lock(){
disable interrupt;
if(value==free){
value=busy
}else{
添加到锁的等待队列
切换到下一个线程
}
enable interrupt
}
unlock(){
disable interrupt
value=free
if(有线程在等待锁){
移到就绪队列
value=busy
}
enable interrupt
}
4 以最少繁忙等待 测试与设置来实现锁
guard 用来保证每次只有一个线程获得value并对其操作
lock(){
while(test_and_set(guard)){}
if(value==free){
value=busy;
guard=0;
}else{
添加到锁的等待队列
guard=0
切换线程
}
}
unlock(){
while(test_and_set(guard)){}
value=free
if(有其他线程在等待锁){
移到就绪队列
value=busy
}
guard=0
}