私は単純な生産者/消費者プログラムを作成しようとしています。私はこのコードを持っています:
//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」を追加しましたが、問題は解決しません。