首页 > 解决方案 > binary semphore - 当我们连续执行 2 sem_up 然后 2 down 时会发生什么?

问题描述

我得到了应该打印 S1-S9 的信号量代码:

void func1(int s1, int s2){
    printf("S1\n");
    bsem_up(s2);
    printf("S5\n");
    bsem_up(s2);
    printf("S8\n");
    printf("S9\n");
    bsem_down(s1);
    printf("S7\n");
    bsem_up(s2);
}   

void func2(int s1, int s2){
    bsem_down(s2);
    printf("S2\n");
    printf("S3\n");
    bsem_down(s2);
    printf("S6\n");
    bsem_up(s1);
    bsem_down(s2);
    printf("S4\n");
    bsem_up(s2);
}

int main(){
    int s1 = bsem_alloc();
    int s2 = bsem_alloc();
    bsem_down(s1);
    bsem_down(s2);
    int pid = fork();

    if(pid == 0){
        func1(s1, s2);
    }
    else{
        func2(s1, s2);
    }
    exit(0);
}

我试图理解如果流程是这样的:bsem_up(s2);将在 process1 上连续调用,因为这是二进制信号量,所以它就像只调用一个,对吗?据我所知,在这种情况下,当进程 2 运行 bsem_down(s2) 时,没有人会叫醒他

process 2:
  bsem_down(s2);

then process 1:
    printf("S1\n");
    bsem_up(s2);
    printf("S5\n");
    bsem_up(s2); //2 bsem_up in a row in some scenrio
    printf("S8\n");
    printf("S9\n");

then process 2:
    printf("S2\n");
    printf("S3\n");
    bsem_down(s2); //no one will wake him up

标签: semaphore

解决方案


推荐阅读