如何退出简单的生产者-消费者问题
|
我正在尝试制定一个简单的生产者-消费者计划。我有以下代码:
//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
请注意,没有写出“再见!”。另一方面,额外的“消费”是。该解决方案有什么问题?使用全局变量检测结束不是可以的吗?无法弄清楚...
谢谢您的任何想法。
编辑:
根据您的建议,我将局部变量的分配更改为volatile并添加了\'\\ n \',但问题仍然存在。
没有找到相关结果
已邀请:
2 个回复
醒荒捆府绣
蹄寄噬非芹