2017-08-02 12 views
1

Kann ein Thread-Pool mit einer einzelnen Thread-Funktion ohne Mutex-Sperre ausgeführt werden?Kann ein Thread-Pool auf einer einzelnen Thread-Funktion ausgeführt werden?

Etwas wie das Folgende.

void* thread_func(void* p) { 
} 

for(int i = 0 ; i < N ; i++) } 
    pthread_create(&t_id, &attr, thread_func, null); 
} 

Oder soll ich passiere jede pthread_create seine eigene Thread-Funktion?

+2

Ich bin nicht sicher, was Sie genau meinen, aber wenn Sie die gleiche Funktion für alle Threads in Ihrem Pool ausführen möchten, hängt es davon ab, ob Sie auf eine freigegebene Ressource e zugreifen. G. ein Zähler oder ähnliches. – CRoemheld

+0

@marcusshep Bitte verwenden Sie keine Codeformatierung für zufällige Phrasen, nur für Code- und Variablen-/Funktionsnamen. – interjay

+2

Sie können die gleiche Thread-Funktion für mehr als einen Thread verwenden. Wenn Sie auf freigegebene Daten zugreifen, die gerade geändert werden, benötigen Sie wahrscheinlich einen Mutex. – interjay

Antwort

2

Ist es möglich, dass ein Thread-Pool mit einer einzelnen Thread-Funktion ohne Mutex-Sperre ausgeführt wird?

Ja, es ist möglich. Aber es hängt von Ihrer thread_func Funktion ab. Wenn Sie eine gemeinsam genutzte Ressource zugreifen, zum Beispiel eines Zähler und Sie nicht über einen Mutex verwenden, dann könnten erleben Sie einen Renn Zustand:

int counter; // set to 2 in main function 

void* thread_func(void *p) { 
    counter = counter + 1; 
} 
  • Thread A von dem Zähler (Wert lautet: 2)
  • Thread B liest aus dem Zähler (Wert: 2)
  • Thread B erhöht Zähler (Wert: 3)
  • Thread A erhöht Zähler (Wert: 3)

Dies passiert, weil Thread A immer noch den Wert 2 für den Zähler hat und 1 addiert, was zu 3 (wieder) führt, obwohl der Zählerwert nach normalem Verständnis 4 sein sollte, nachdem beide Threads den Wert erhöht haben.

Wenn Sie einen Mutex hinzufügen, müssen die Threads auf einen anderen Thread warten, der derzeit den Zählerwert ändert.

Verwandte Themen