独木桥问题
// 右边
右边停止排队(自己加入队伍)
看前面有没有人
我是第一个
占住桥
加入队伍
右边允许排队(加入队伍完成)
过桥
过完桥,右边停止排队(自己离开队伍)
离开队伍
我是最后一个
释放桥
右边允许排队(离开队伍完成)
//--------华丽的分割线
// 左边
左边停止排队(自己加入队伍)
看前面有没有人
我是第一个
占住桥
加入队伍
左边允许排队(加入队伍完成)
过桥
过完桥,左边停止排队(自己离开队伍)
离开队伍
我是最后一个
释放桥
左边允许排队(离开队伍完成)
实现代码
int count_left = 0;
int count_right = 0;
semafore mutex_left = 1;
semafore mutex_right = 1;
semafore mutex_bridge = 1;
left(){
P(mutex_left);
if(count_left == 0){
P(mutex_bridge);
}
count_left++;
V(mutex_left);
过桥;
P(mutex_left);
count_left--;
if(count_left == 0){
V(mutex_bridge);
}
V(mutex_left);
}
right(){
P(mutex_right);
if(count_right == 0){
P(mutex_bridge);
}
count_right++;
V(mutex_right);
过桥;
P(mutex_right);
count_right--;
if(count_right == 0){
V(mutex_bridge);
}
V(mutex_right);
}
注:可能导致某一边一直饥饿,通个过桥计数器解决。
附图:
留下评论
您的电子邮箱地址并不会被展示。请填写标记为必须的字段。 *