2017-12-21 15 views
1

Ich möchte den Wert eines in einer Struktur gespeicherten Zählers erhöhen. Es werden 3 Threads in die Funktion tattoo_shop kommen, um die Anzahl der Personen zu erhöhen, aber aus bestimmten Gründen bleibt der Wert von number_of_people gleich.So erhöhen Sie den Wert einer Struktur mit mehreren Threads in C

Ich habe versucht, den Fall der Reihe nach zu reproduzieren, und es funktioniert. Gibt es etwas Besonderes zu tun, während ich mit Threads arbeite? Danke :)

typedef struct { 
    int number_of_people; 
}Queue; 

void *tattoo_shop(void *arguments){ 
    Client *args = arguments; 
    Queue the_queue; 

    add_to_the_queue(&the_queue,args); 
} 

void add_to_the_queue(Queue *the_queue, Client *the_client) { 

    pthread_mutex_lock(&mutex_queue); 
    the_queue->number_of_people++; 
    pthread_mutex_unlock(&mutex_queue); 

    printf("The thread %d is changing the counter of the queue which is now %d \n",the_client->id,the_queue->number_of_people); 
} 

Ausgang:

The thread 1 is changing the counter of the queue which is now 1 
The thread 0 is changing the counter of the queue which is now 1 
The thread 2 is changing the counter of the queue which is now 1 
+1

the_queue eine lokale Variable ist, und jedes Mal, wenn die Routine aufrufen, ist es intialized neu – Ora

+0

Es ist mir nicht klar, wie Sie Ihre mehrere Threads die gleiche Warteschlange teilen enden. –

+0

@OliverCharlesworth meine Threads gehen alle zur Funktion tattoo_shop und von dort bekommen sie die Funktion add_to_the_queue. – MaxUt

Antwort

2

Ihr Code ist Unsinn, da Queue the_queue; eine lokale Variable ist, nicht ein gemeinsamer ein.

Aber wenn es im Dateibereich oder static zugewiesen wurde, ist der Code meistens in Ordnung. Man sollte das gemeinsam genutzte Objekt nicht außerhalb von Mutex-Wächtern lesen, da Schreibvorgänge von anderen Stellen nicht garantiert sind. Leichte Anpassung dieses Problem zu beheben:

{ 
    pthread_mutex_lock(&mutex_queue); 
    int people = the_queue->number_of_people++; 
    pthread_mutex_unlock(&mutex_queue); 

    printf("%d", people); 
} 
+0

Wie kann ich die_queue freigeben? Die Sache ist, dass ich dann diese Daten aus der Funktion add_to_the_queue holen muss, um Tests in tattoo_shop durchzuführen. – MaxUt

+0

@MaxUt: Sie definieren die Warteschlange außerhalb der Funktionen (statische Dateivariable). Das initialisiert es auch auf Null; Ihr Code inkrementiert eine nicht initialisierte Variable, und Sie haben nur Glück, dass der Speicher auf Null gesetzt wird (wahrscheinlich um zu verhindern, dass Sie die Daten, die ein vorheriger Prozess im selben physischen Speicher gespeichert hat, aufspüren, aber das wird von keinem Standard garantiert). Und alle Zugriffe auf die Warteschlange müssen durch den Mutex vermittelt werden (der, wie ich feststelle, im angegebenen Code nicht definiert/deklariert ist, sondern eine Dateibereichsvariable sein muss). Ihr Druckcode sollte im Bereich des Mutex Lock/Unlock-Paares liegen. –

Verwandte Themen