2016-06-17 7 views
1

Gibt es irgendwelche Risiken mit dem unten stehenden Code? Kann mir bitte jemand erklären, warum ich in meinem Fall bitte pthread_cond_broadcast anstelle von pthread_cond_signal benutzen muss?Ist das die korrekte Verwendung von Bedingungsvariablen?

#include <pthread.h> 

unsigned int target_id; 
pthread_mutex_t my_mytex; 
pthread_cond_t my_cond; 

void *print_item_(void *ar) 
{ 
    int id = *((unsigned int*)ar); 

    pthread_mutex_lock(&my_mytex); 

    while (id != target_id) 
     pthread_cond_wait(&my_cond, &my_mytex); 

    printf("%u\n", id); 
    target_id++; 
    pthread_cond_broadcast(&my_cond); 

    pthread_mutex_unlock(&my_mytex); 
    free(ar); 
    return NULL; 
} 

int main() 
{ 
    pthread_t *threads; 
    unsigned int *var; 
    int i; 

    target_id = 1; 
    pthread_mutex_init(&my_mytex, NULL); 
    pthread_cond_init(&my_cond, NULL); 

    threads = (pthread_t*)malloc(sizeof(pthread_t)*50); 

    for(i = 1; i < 50; i++) 
    { 
     var = (unsigned int*)malloc(sizeof(unsigned int)); 
     var[0] = i+1; 

     pthread_create(&threads[i], NULL, print_item_, (void*)var); 
    } 

    var = (unsigned int*)malloc(sizeof(unsigned int)); 
    var[0] = 1; 

    pthread_create(&threads[0], NULL, print_item_, (void*)var); 

    for(i = 0; i < 50; i++) 
     pthread_join(threads[i], NULL); 

    free(threads); 
} 
+0

@ 4386427 Danke für die Hilfe! Ich meine, warum Pthread_cond_wait in meinem Fall nicht funktioniert. – MATH000

+0

@ 4386427 Ja, wenn ich das mache, pausiert das Programm für immer. Warum? – MATH000

+1

Sie haben Tonnen von Speicherlecks. Sie sind nicht 'free'ing' malloc'ated vars ... – LPs

Antwort

1

Die Art, wie Sie Zustandsvariablen verwenden, ist korrekt.

Der Grund, warum Sie pthread_cond_broadcast() verwenden müssen, ist, dass in Ihrem Entwurf möglicherweise mehrere Threads auf die Bedingungsvariable warten, wo nur ein bestimmter von ihnen bereit ist fortzufahren, wenn die Bedingung signalisiert wird. Das bedeutet, dass Sie pthread_cond_broadcast() verwenden müssen, um sie zu wecken alle oben, die dafür sorgt, dass der einzelne Thread, der fortfahren kann, geweckt wird.

pthread_cond_signal() ist eine Optimierung - es weckt eine der wartenden Threads, aber es wird nicht angegeben, die man, es ist also nur für Situationen, in denen jede der wartenden Threads in der Lage, wenn geweckt, um fortzufahren.

Übrigens wird nichts durch Spezialgehäuse-Thread 1 (i == 0) in der Schleife, die pthread_create() aufruft, gewonnen.