2017-09-19 1 views
-2

Je fais simple producteur/problème de consommation. J'ai un producteur (chef) qui produit des portions quand le consommateur (sauvage) les consomme toutes, alors un sauvage doit attendre que le chef remplisse le pot. Je ne comprends pas quelle est mon erreur car les sauvages consomment des portions, mais le chef ne remplit pas le pot.course multitraitement partage une variable

Voici le programme:

#include <stdio.h> 
#include <stdlib.h> 
#include <semaphore.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#include <sys/wait.h> 
#include <fcntl.h> 

int shmid, semid; 
int *portions; 
sem_t *mutex, *empty, *full; 

char sem_1[]= "mutex"; 
char sem_2[]= "full"; 
char sem_3[]= "empty"; 

void clear() 
{ 

    if (shmctl(shmid,IPC_RMID,0) == -1) perror("shmctl"); 
} 

void producer(int num, int m) 
{ 
    int i; 

    while(1) { 


    }  
} 

void consumer(int num, int rounds) 
{ 

     int i; 



} 


int main(int argc, char *argv[]) 
{ 

int i; 
int N, M, NROUNDS, pid; 


if (argc != 4) 
{ 
    fprintf(stderr,"insert N savages, M portions e NROUNDS\n"); 
    exit(1); 
} 

N=atoi(argv[1]); 
M=atoi(argv[2]); 
NROUNDS=atoi(argv[3]); 




/* generate producer and consumers */ 




     } 

    for(i=0;i<N;i++) { 
    pid=wait(NULL); 
    printf("Terminate process %d\n", pid); 
    } 

    clear(); 

} 

Ceci est la sortie:

./a.out 3 5 3 

Savage[2] eats 
Number of portions in pot: 4 
Savage[1] eats 
Number of portions in pot: 3 
Savage[0] eats 
Number of portions in pot: 2 
Savage[2] eats 
Number of portions in pot: 1 
Savage[1] eats 
Number of portions in pot: 0 
Savage[0] eats 
Number of portions in pot: -1 
Savage[2] eats 
Number of portions in pot: -2 
Terminate process 10287 
Savage[1] eats 
Number of portions in pot: -3 
Savage[0] eats 
Number of portions in pot: -4 
Terminate process 10285 
Terminate process 10286 
+0

Etes-vous sûr sémaphores sont le mécanisme de synchronisation correcte à utiliser? Considérez les variables de condition ... –

Répondre

1

Votre consommation prend le mutex, les signaux que le pot est vide et ne libère le mutex, de cette façon , le producteur ne peut jamais prendre le mutex et remplir le pot et votre processus sera bloqué.

For a better understanding, read the Producer Consumer section in this great book.

+0

Si je change qu'avec cela, le programme ne démarre pas: si ((* portions) == 0) {sem_post (mutex) sem_post (vide) sem_wait (complet) – Jing

+0

Lire le livre I lié , votre algorithme a probablement plus d'un problème. –