2016-07-26 31 views
1

Ich lese das Buch, Modern Operation Systems von AS TANENBAUM und es gibt ein Beispiel zur Erläuterung der Zustandsvariablen wie folgt. Es sieht für mich so aus, als wäre es ein Deadlock und ich bin mir nicht sicher, was ich vermisse.Dead Lock im Mutex, Zustand variabler Code?

Nehmen wir an Verbraucher Thread beginnt zuerst. Direkt nach ist der_mutex gesperrt, Verbraucher Thread ist blockiert Warten auf die Bedingung Variable, Condc.

Wenn Produzent zu diesem Zeitpunkt ausgeführt wird, the_mutex noch gesperrt werden, weil Verbraucher nie veröffentlicht. So Produzent wird auch blockiert werden.

Dies sieht für mich ein Lehrbuch Deadlock Problem. Hab ich hier etwas verpasst? Thx

#include <stdio.h> 
#include <pthread.h> 

#define MAX 10000000000   /* Numbers to produce */ 
pthread_mutex_t the_mutex; 
pthread_cond_t condc, condp; 
int buffer = 0; 


void* consumer(void *ptr) { 
    int i; 

    for (i = 1; i <= MAX; i++) { 
    pthread_mutex_lock(&the_mutex); /* lock mutex */ 

    /*thread is blocked waiting for condc */ 
    while (buffer == 0) pthread_cond_wait(&condc, &the_mutex); 
    buffer = 0; 
    pthread_cond_signal(&condp);  
    pthread_mutex_unlock(&the_mutex); 
    } 
    pthread_exit(0); 
} 

void* producer(void *ptr) { 
    int i; 

    for (i = 1; i <= MAX; i++) { 
    pthread_mutex_lock(&the_mutex); /* Lock mutex */ 

    while (buffer != 0) pthread_cond_wait(&condp, &the_mutex); 
    buffer = i; 
    pthread_cond_signal(&condc);  
    pthread_mutex_unlock(&the_mutex); 
    } 
    pthread_exit(0); 
} 

int main(int argc, char **argv) { 
    pthread_t pro, con; 

    //Simplified main function, ignores init and destroy for simplicity 
    // Create the threads 
    pthread_create(&con, NULL, consumer, NULL); 
    pthread_create(&pro, NULL, producer, NULL); 
} 

Antwort

3

Wenn Sie auf einer Bedingungsvariable warten, wird der zugehörige Mutex für die Dauer der Wartezeit freigegeben (das ist, warum Sie die Mutex pthread_cond_wait passieren).

Wenn pthread_cond_wait zurückkehrt, ist der Mutex immer wieder gesperrt.

Wenn Sie dies berücksichtigen, können Sie der Logik des Beispiels folgen.