I am trying to develop a simple producer-consumer program. I have this code:
//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 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 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; }
Unfortunately, this code ends in a dead end. I have this output:
I:0 producing consuming I:1 producing consuming I:2 producing consuming I:3 producing consuming I:4 producing consuming I:5 It time to say goodbye! consuming //deadlock - nothing written
Please note: "Goodbye!" Not written. On the other hand, excess "consumption". What is wrong with this decision? Using a global variable to detect the end is not suitable? I can not understand this ...
Thanks for any ideas.
EDIT: In accordance with your advice, I changed the distribution of the local variable to volatile and added "\ n", but the problem persists.
source share