我正在尝试制定一个简单的生产者 - 消费者程序。我有这样的代码:如何退出简单的生产者 - 消费者问题
//global variable g_lastImage is declared as:
volatile int g_lastImage = 0;
void producer(void) {
int i = 0;
while (1) {
sem_wait(&g_shm->PSem);
printf("I:%d\n",i);
if (i == 5) {
g_lastImage = 1;
printf("It's time to say goodbye!\n");
sem_post(&g_shm->ChSem);
return;
}
printf("producing\n");
i++;
sem_post(&g_shm->ChSem);
}
}
void consumer(void) {
while (1) {
sem_wait(&g_shm->ChSem);
if (g_lastImage) {
printf("Bye!\n");
return;
}
printf("consuming\n");
sem_post(&g_shm->PSem);
}
}
int main() {
alloc(); /*allocates shared memory and two semaphores,
ChSem on initial counter value 0 and PSem on value 1*/
int processes = 1; //let's start with one process only just for now
int id = 0, i = 0, status;
for (i = 0; i < processes; i++) {
id = fork();
if (id < 0) {
perror ("error\n");
exit(1);
} else if (id == 0) {
consumer();
printf("child exits\n");
exit(0);
}
}
producer();
for (i = 0; i < processes; ++i) {
wait(&status);
}
return 1;
}
不幸的是,这段代码以死锁结束。我有这个输出:
I:0
producing
consuming
I:1
producing
consuming
I:2
producing
consuming
I:3
producing
consuming
I:4
producing
consuming
I:5
It's time to say goodbye!
consuming
//deadlock - nothing written
请注意“再见!”不写。另一方面额外的“消费”是。这个解决方案有什么问题?使用全局变量来检测结束是不行的?想不出来...
谢谢你的任何想法。
编辑: Acording你的建议我改变局部变量的分配挥发性,并且增加了“\ n”,但问题仍然存在。
对不起,愚蠢的错误,这个打印出来,虽然问题依然存在。 – tsusanka 2011-04-14 08:11:28