2016-06-06 5 views
-1

Ich möchte Verwendung von Bedingungsvariablen in C ein einfaches multithreaded Programm schreiben, machenErklärung, warum Bedingungsvariablen in C funktioniert nicht richtig

I Haupt-Thread (Thread A) haben wollen, die für 5 Sekunden und dann wache auf wartende Clients (Therad B, möglichst viele), die eine Nachricht drucken. Dies sollte die ganze Zeit wiederholt werden.

Ich habe bereits das Handbuch gelesen, aber ich verstehe nicht, warum das nicht funktioniert. Nehmen wir an, dass ich diese Variablen an alle Threads über Zeiger gegeben haben (richtig, ich habe überprüft, dass):

pthread_mutex_t* mutex; 
pthread_cond_t* cond; 
int* variable; 

Ich habe den folgenden Code:

THREAD A (Schlafen):

while(1) 
{ 
    lockMutex(mutex); 
    (*variable) = 1; 
    pthread_cond_broadcast(cond); 
    unlockMutex(mutex); 
    sleep(5); 
    lockMutex(mutex); 
    (*variable) = 0; 
    pthread_cond_broadcast(cond); 
    unlockMutex(mutex); 
} 

THREAD B (Druck):

while(1) 
{ 
    lockMutex(mutex); 
    while((*variable) == 1) 
     pthread_cond_wait(cond, mutex); 
    unlockMutex(mutex); 
    fprintf("Active thread! Number: %d\n", id); 
    lockMutex(mutex); 
    while((*(variable))==0) 
     pthread_cond_wait(cond, mutex); 
    unlockMutex(mutex); 
} 

ich habe keine Deadlock , aber leider funktioniert das nicht wie erwartet. Kann mir jemand eine Erklärung geben, was soll ich tun? Ich wäre dankbar für jede Hilfe.

+1

Was wird erwartet? Was passiert eigentlich? – nicomp

Antwort

2

Das wahrscheinliche Problem ist, dass Thread A sofort *variable = 1 setzt, bevor einer der schlafenden Threads eine Chance hat, es als 0 zu sehen. Nur weil die Bedingungsvariable wartende Threads aufwacht, heißt das nicht, dass diese aufgeweckten Threads schnell genug geplant werden, um Thread A daran zu hindern, erneut in *variable zu schreiben.

+0

Ok, also gibt es irgendeine Lösung, die es funktioniert? – bakala12

+1

Verwenden Sie eine andere Bedingungsvariable, auf die Thread A wartet, und Thread B signalisiert, wenn die geschützte Variable verwendet wird. – Barmar

+0

Vielen Dank für Ihren Hinweis. Ich schaffe es zu erreichen, was ich will: D – bakala12