2016-04-20 12 views
1

Dies ist mein Code für Hersteller und Verbraucher Problem. Es kann kompiliert werden, aber wenn ich das Programm starte, wird nichts gedruckt. Ich teste das Programm und fand das Problem vielleicht über sem_wait(). Warum könnte das Programm kompiliert werden, aber die Ausgabe ist falsch? Vielen Dank.sem_wait() in Hersteller und Verbraucher

int main(int argc, char *argv[]) { 
    pthread_mutex_init(&mutex, NULL); 
    empty = sem_open("/mysem", O_CREAT, 0644, BUFFER_SIZE); 
    full = sem_open("/mysem", O_CREAT, 0644, 0); 

    pthread_create(&pro_thread, NULL, producer, NULL); 
    pthread_create(&con_thread, NULL, consumer, NULL); 

    pthread_exit(NULL); 

    return 0; 
} 

Ist die Funktion sem_open() richtig? Ich habe die folgende Zeile kommentiert und das Programm könnte laufen ... vielleicht ist das Problem über sem_open?

empty = sem_open("/mysem", O_CREAT, 0644, BUFFER_SIZE); 

Antwort

0

Es scheint, dass Ihr Produzent nie etwas

Überprüfen Sie die Semaphore Namen erzeugt. Kann sein empty und full sind die gleiche Instanz wie Sie den gleichen Namen für beide in Ihrem sem_open Funktion

+0

Ich bin nicht mit Ihnen einverstanden. Zu Beginn ist counter 0 und BUFFER_SIZE ist 10, der Producer geht also nicht in die while-Schleife. – Helen

+0

Wenn der Puffer voll ist, bedeutet counter == BUFFER_SIZE, dass der Produzent die Produktion stoppt, damit der Produzent stoppt. Anfangs gab es keinen Artikel im Puffer, so dass der Produzent etwas produzieren konnte. – Helen

+0

Sie haben Recht, ich habe es falsch gesehen ... Im Denken, wenn die pthread_mutex_lock (& ​​Mutex); sorgt dafür, dass der Verbraucher die Sperre einnimmt und für immer in seiner while-Schleife wartet. In diesem Fall wird der Produzent nie etwas produzieren, weil er darauf wartet, dass der Konsument den Mutex freigibt. – Jorge

Verwandte Themen