同步三个进程以按特定顺序打印字母

时间:2013-11-29 20:24:59

标签: c synchronization mutex

我有三个进程可以打印一个字母,A,B和C.

我想要以下输出。

AB AC AB AC AB .....

我有三个二进制信号量初始化为以下值:

print_a = 1
print_b = 0
print_c = 0

流程A:

while(1) {
    wait(print_a);

    sleep(2); //So it's possible to see the output properly
    printf(" A");
    fflush(stdout);

    signal(print_b); 
}

流程B:

while(1) {
    wait(print_b);

    printf("B");
    fflush(stdout);

    signal(print_a);
    wait(print_b);

    signal(print_c);
}

流程C:

while(1) {
    wait(print_c);

    printf("C");
    fflush(stdout);

    signal(print_a);
}

使用文件系统实现信号和等待。等待是一个螺旋锁试图删除文件,直到它成功。信号创建一个文件。

void wait(char * file){
    while(unlink(file) != 0);

}

void signal(char * file){
    if(open(file, O_CREAT | O_RDWR, 00777) == -1) {
        printf("Failed to open %s\n", file);
        exit(-1);
    }
}

在大多数情况下,我得到了我想要的正确输出。但是,偶尔输出会出错。

这是输出的一个例子:

AB AC AB AC AB AC AB AC AB AC AB AC AB AB AC AC AB AC AB AB AC A >>ACB<< AB AC AC AB AB AC AB

AC ABC AC AB >>ABC<< AB AC AC A AB AC AB AB AC AC AB AB AC >>ABC<< AB AC AC AB AB AC AC AB AB AC

我似乎无法弄清楚在B或C而不是A之后打印B或C的原因。

更新:

如果我改变等待:

void wait(char * file){
    while(unlink(file) != 0) {
            usleep(1000 * 100);
    }
}

似乎工作正常。仍然不明白为什么。

1 个答案:

答案 0 :(得分:0)

print_b中,在我看来,您需要在发出a信号之前等待c

while(1) {
    wait(print_b);
    wait(after_a);
    printf("B");
    fflush(stdout);
    signal(print_a);
    wait(after_a);
    signal(print_c);
}

因为在after_a打印时会设置a,如果a尚未对新信号做出反应,那么c没有理由不来在下一个a ...

之前

顺便说一句,我看不到你在哪里添加空间?