2016-06-11 19 views
1

Ich versuche, eine Hersteller/Verbraucher-Anwendung zu machen. Das Problem ist, mein Produzent füllt den ganzen Puffer, DANN entfernt der Verbraucher den ganzen Puffer ... sollte der Verbraucher nicht einen Gegenstand aus dem Puffer entfernen, sobald der Produzent einen post zum Semaphor macht?Arbeiten mit Hersteller und Verbraucher, Sempahore in C

meinen Code:

void* producerFunc(void* arg) 
{ 
    while(n_insertions < N_PRODUCTS) 
    { 
     sem_wait(&sem_postAvaliable); 
     sem_wait(&mutex); 
     //Insert Item 
     sem_post(&mutex); 
     sem_post(&sem_posTaken); 
    } 
    pthread_exit(NULL); 
} 

void* consumerFunc(void* arg) 
{ 
    while(n_consumed < N_PRODUCTS) 
    { 
     sem_wait(&sem_posTaken); 
     sem_wait(&mutex); 
     //Remove from bufer 
     sem_post(&mutex); 
     sem_post(&sem_postAvaliable); 
    } 
    pthread_exit(NULL); 
} 

n_insertions ist eine globale ganze Zahl, die die Anzahl der Elemente in den Puffer eingefügt zählt;

n_consumed ist eine globale Ganzzahl, die zählt, wie oft der Verbraucher ein Element aus dem Puffer verbraucht hat.

+2

Das ist seltsam, bei welchem ​​Wert initialisierst du die Semaphoren 'sem_postAvaliable' und' sem_posTaken'? Außerdem können Sie 'pthread_mutex_t' verwenden, um einen Mutex zu deklarieren und dann' pthread_mutex_lock' und 'pthread_mutex_unlock' zu verwenden, um diesen Mutex zu entsperren und zu sperren. – OiciTrap

+0

@cursillosonline sem_postAvaliable ist auf 5 gesetzt, die Größe meines Puffers. sem_posTaken wird mit 0 initialisiert, weil noch kein Speicherplatz des Puffers belegt ist. Ich werde mit pthread_mutex_lock überprüfen (Irgendwelche signifikanten Unterschied?) – PlayHardGoPro

Antwort

3

Auf einem sehr hohen Niveau, wenn Sie eine sem_post(&sem_posTaken) tun, sagen Sie den Verbrauchern "Hey !, können Sie etwas konsumieren", aber danach je nach Prozessor Scheduler die Produzenten weiter produzieren können, bis der Zähler der Semaphore doesn Erlaube ihnen nicht, also vielleicht konsumiert ein Konsument direkt nach dem Hersteller etwas oder vielleicht nach 3 Einsätzen, wer weiß? Der Faden wird blockiert, wenn Sie versuchen, eine sem_wait einer Semaphore, deren Zähler zu machen ist 0.

Wenn Sie zwischen einem Einsatz und einem Entfernen wechseln wollen, versuchen Sie sem_postAvaliable-1 Initialisierung, so würden Sie erlauben nur eine Insertion an Erstens, weil die anderen Threads blockiert sind, die auf eine sem_post(&sem_postAvaliable) warten, dann könnte nur ein Verbraucher konsumieren, was auch immer Sie in den Puffer eingefügt haben, aber beachten Sie, dass in diesem Fall ein Puffer mit einer Größe größer als 1 bedeutungslos wäre.

+0

Also ist mein Code richtig? OMG – PlayHardGoPro

+1

Sicher, zumindest sehe ich in diesem Teil des Codes nichts falsch. – OiciTrap

+0

Ich nehme an, dass die Tatsache, dass es den ganzen Puffer füllt und den ganzen Puffer auf einmal fast jedes Mal leer lässt, ein Zeichen dafür ist, dass etwas nicht stimmt, P Danke – PlayHardGoPro