一 锁变量的实现
while(LOCK); //只要临界区有进程,lock就等于1,就一直等待
//某一时刻,临界区进程执行完毕,那么LOCK=0;while循环结束
LOCK=1; //那么其他进程(假设A进程)就要进入临界区
//令LOCK=1,不让其它进程(除A之外)进入
<critical section> //进入临界区
LOCK=0; //出临界区
<non_critical section>
二 严格轮转法
进程0:
while(turn!=0); //只要turn变量不为0 就是为1 说明进程0不能运行
//一旦跳出while循环 表示turn=0
<critical section> //进入临界区
turn=1; //出来之后令turn=1
<non_critical section> //非临界区区域
进程1:
while(turn!=1);
<critical section> //进入临界区
turn=0; //出来之后令turn=0
<non_critical section> //非临界区区域
三 TSL指令实现互斥(Test and set Lock)
#include<iostream>
using namespace std;
int lock=0;
void TSL(int *pLock)
{
int retval;
retval=*pLock;
*pLock=1;
return retval; //实际上每次返回的是pLock的值(传进来的值,未改变之前)。
}
void enter_region()
{
while(TSL(&lok)){};
}
void leave_region()
{
lock=0;
}
int main()
{
enter_region();
<critical section>
leave_region();
<non_critical section>
}
四 swap指令实现互斥
#include<iostream>
using namespace std;
int lock=0;
void swap(int *a,int *b)
{
int temp=0;
temp=*a;
*a=*b;
*b=temp;
}
void enter_region()
{
int key=1;
while(key==1)
swap(swap(&key,&lock));
}
void leave_region()
{
lock=0;
}
int main()
{
enter_region();
<critical section>
leave_region();
<non_critical section>
}
五 CAS指令实现互斥(compare and swap)
#include<iostream>
using namespace std;
int lock=0;
int CAS(int *value,int expected,int new_value)
{
int temp=*value;
if(*value==expected)
{
*value=new_value;
}
return temp;
}
void enter_region()
{
while(CAS(&lock,0,1));
}
void leave_region(){
lock=0;
}
int main()
{
enter_region();
<critical section>
leave_region();
<non_critical section>
}