【发布时间】: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