【问题标题】:Synchronize three processes to print letters in a certain order同步三个进程按一定顺序打印字母
【发布时间】:2013-11-29 20:24:59
【问题描述】:

我有三个进程可以打印一个字母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);
}

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

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 在 B 或 C 而不是 A 之后打印。

更新:

如果我改变等待:

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

它似乎工作正常。不过还是不明白为什么。

【问题讨论】:

  • 我想问题是——当没有文件时wait 会做什么?它会等待文件出现,然后将其删除吗?或者它会一直移动。后一种行为会导致您看到的问题。没有看到你对wait的实现就无法判断...
  • 在帖子中添加了等待和信号。

标签: c synchronization mutex


【解决方案1】:

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 之前出现……

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

【讨论】:

  • 查看我更新的帖子。为什么 C 或 B 有时不等待 after_a?如果我们以 B 为例。即使 C 在 signal(print_a); 之后运行而不是 A信号(打印_c); C不应该在wait(after_a)中被阻塞吗?
猜你喜欢
  • 2017-09-15
  • 2017-10-09
  • 2020-08-18
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2013-07-24
相关资源
最近更新 更多