Pourquoi mon blocage producteur-consommateur?

Mon code est ici: http://pastebin.com/Fi3h0E0P

Voici la sortie

0 Should we take order today (y or n): y Enter order number: 100 More customers (y or n): n Stop serving customers right now. Passing orders to cooker: There are total of 1 order(s) 1 Roger, waiter. I am processing order #100 

Le serveur doit prendre les commandes et les donner au cuisinier. Le serveur doit attendre que le cuisinier termine toutes les pizzas, livre la pizza, puis prenne de nouvelles commandes.

J’ai demandé comment fonctionne le PV dans mon précédent post ici .

Je ne pense pas que cela a quelque chose à voir avec \n consumr? J’ai essayé toutes sortes de combinaisons de wait() , mais aucune ne fonctionne.

Où est-ce que je me suis trompé?

La partie principale est ici:

 //Producer process if(pid > 0) { while(1) { printf("0"); P(emptyShelf); // waiter as P finds no items on shelf; P(mutex); // has permission to use the shelf waiter_as_producer(); V(mutex); // cooker now can use the shelf V(orderOnShelf); // cooker now can pickup orders wait(); printf("2"); P(pizzaOnShelf); P(mutex); waiter_as_consumer(); V(mutex); V(emptyShelf); printf("3 "); } } if(pid == 0) { while(1) { printf("1"); P(orderOnShelf); // make sure there is an order on shelf P(mutex); //permission to work cooker_as_consumer(); // take order and put pizza on shelf printf("return from cooker"); V(mutex); //release permission printf("just released perm"); V(pizzaOnShelf); // pizza is now on shelf printf("after"); wait(); printf("4"); } } 

Donc, j’imagine que c’est le chemin d’exécution: entrez waiter_as_producer, puis accédez au processus enfant (cooker), puis transférez le contrôle vers le parent, terminez waiter_as_consumer, revenez à l’enfant. Les deux attentes reviennent au parent (comme je l’ai dit j’ai essayé toutes les combinaisons possibles de wait () …).

  • changez pour #define PERMS (0) (ce n’est pas un masque de mode de fichier octal!)
  • supprimer tous les wait(); s
  • taille d’échelle par sizeof: if((shmid=shmget(1000,sizeof (int) * BUFSIZE,IPC_CREAT | PERMS)) < 0) , et d'autres (la taille est augmentée modulo semsize / pagesize, mais c'est une bonne habitude de utiliser la bonne taille de toute façon)

résolu le problème ici.

L'idée est la suivante: vous n'avez pas besoin d'attendre; l'un des {producteur, consommateur} sera bloqué quelque part sur un P ():

de P ():

 sb.sem_flg = 0; /* blocking call */ if (semop(sid, &sb, 1) == -1) perror("semop"); 

Et d'ailleurs: wait(&status) nécessite au moins un argument. (et vous auriez probablement besoin d’une des autres fonctions d’attente, telles que wait3 () ou waitpid ())

Extra outre:

  • Je mettrais "volatile" avant les déclarations des objects partagés: volatile int *buff;
  • main () devrait retourner int, les retours sans valeur sont faux (avant c99)
  • la plupart des opérations de pointeur sont maladroites: order = buffer[i]; est le même que order = *(buffer+i); , mais plus lisible.