独木桥问题

少于 1 分钟读完

//  右边
右边停止排队(自己加入队伍)
看前面有没有人
我是第一个
    占住桥
加入队伍
右边允许排队(加入队伍完成)

过桥
过完桥,右边停止排队(自己离开队伍)
离开队伍
我是最后一个
    释放桥
右边允许排队(离开队伍完成)


//--------华丽的分割线
// 左边
左边停止排队(自己加入队伍)
看前面有没有人
我是第一个
    占住桥
加入队伍
左边允许排队(加入队伍完成)

过桥
过完桥,左边停止排队(自己离开队伍)
离开队伍
我是最后一个
    释放桥
左边允许排队(离开队伍完成)

实现代码

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);
}

注:可能导致某一边一直饥饿,通个过桥计数器解决。

附图:

登录界面

留下评论

您的电子邮箱地址并不会被展示。请填写标记为必须的字段。 *

正在加载...