1.单标志法
定义一个turn ,根据turn的值判断那个进程进入临界区
//进程1
while(turn!=0){
//进程卡住,让权
}
// *
处理临界区
//
turn = 1;
//进程2
while(turn!=1){
//进程卡住,让权
}
// *
处理临界区
//
turn = 0;
这样一定是线程交替进行 ,但是若长期无另一个线程改变turn 就会一直停顿
2.双标志法–先进行检查
先判断对方线程是否要操作(谦让)
所以 flag【0】与flag【1】
//进程1
while(flag[1]){
//对方要使用,当前线程卡住
}
//对方不使用
flag[0]=true;
//**
临界操作
//**
flag[0]=false;
//进程2
while(flag[0]){
//对方要使用,当前线程卡住
}
//对方不使用
flag[1]=true;
//**
临界操作
//**
flag[1]=false;
但是问题在于 当这两个线程同时进入 while 都没有发现对方要是用线程,因此 会同时进入临界区
3.双标志–先修改
先表明自己要使用临界区,在判断对方是否使用
//进程1 申请使用
flag[0]=true;
while(flag[1]){
//对方要使用,当前线程卡住
}
//**
临界操作
//**
flag[0]=false;
//进程2 申请使用
flag[1]=true;
while(flag[0]){
//对方要使用,当前线程卡住
}
//**
临界操作
//**
flag[1]=false;
很明显这样会导致一个都进不去的情况
- genius p算法:
有三个标志:
flag1,flag0,turn
/*进程p1*/
flag[0 ] = true;
turn = 1;
while(flag[1]&&turn ==1){
什么也不做
}
/**p1的临界区**/
flag[0] = false;
/*进程p2*/
flag[1 ] = true;
turn = 0;
while(flag[0]&&turn ==0){
什么也不做
}
/**p1的临界区**/
flag[1] = false;
此算法 后进来的进程会让权给先进来的 假设 p1 先进入 ,但是 同样p2也进入 但是稍慢一点 ,则 flag【0】与flag【1】都定义为 true 但是 turn 为 0 所以 p1可以进入 临界区
本文探讨了操作系统中实现线程互斥的几种方法,包括单标志法、双标志法(先检查)及其存在的问题,以及Genius P算法,该算法通过三个标志保证线程的正确调度,避免临界区的并发访问问题。

被折叠的 条评论
为什么被折叠?



