我有三个进程可以打印一个字母,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);
}
}
似乎工作正常。仍然不明白为什么。
答案 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
...
顺便说一句,我看不到你在哪里添加空间?