hell-student
Lieutenant
- Registriert
- Nov. 2007
- Beiträge
- 671
Hallo Zusammen,
vielleicht ist es ja gar nicht so ein komplexes Problem, aber ich mache nun schon etwas länger damit rum und habe keine Lösung gefunden.
Ich habe mehrere Threads (alle vom gleichen Typ) und führen mit unterschiedlichen Daten genau die gleiche Funktion aus, die bedingt durch eine Condition per pthread_cond_wait() warten müssen.
T1 T2 T3 T4 T5
w w w w w w = warten auf die gleiche Bedingung
Sofern nun ein Zeitpunkt kommt (Ereigniss A) sollen alle wieder weiterlaufen. Dies ist kein Problem, indem ich per pthread_cond_broadcast() alle "schlafenden" Threads wecke und diese ihre Arbeit erledigen. Da die Funktionen die diese aufrufen, lange brauchen, habe ich mehrere Synchronisationspunkte eingebaut, bei denen die jeweiligen Threads die Condition abfragen und gegebenfalls sich schlafen legen müssen.
Das Problem ist nun, dass ich genau einen Thread davon weiterlaufen lassen will wenn Ereignis B eintritt. Sofern ich nun alle wecken würde mittels pthread_cond_broadcast() und nur angenommen T4 weiterlaufen lassen will, wie könnte ich das anstellen. Also alle anderen Threads sollen weiter schlafen bleiben. Sofern Ereignis A zu einem späteren Zeitpunkt eintritt sollen alle wieder weiterlaufen.
T1 T2 T3 T4 T5
w w w w w w = warten auf die gleiche Bedingung
w w w w w
w w w w w
w w w w w
w w w w w Ereignis B
w w w a w a = Thread 4 läuft weiter ab, aber alle anderen sollen weiter schlafen
w w w a w
w w w a w
w w w a w
w w w a w
w w w - w - = Thread 4 ist fertig geworden
w w w - w
w w w - w
w w w - w
w w w - w
w w w - w
w w w - w Ereignis A
a a a - a
a a a - a
a a a - a
a a a - a
- - - - - - = alle anderen Threads sind nun fertig geworden.
Ich hatte mir gedacht, dass ich das über mehrere Condition-Variablen machen muss, man kann aber ja nur auf eine immer nur warten, d.h. eine Verschachtelung von pthread_cond_wait() bringt nicht, wenn auf Condition X (äußere) gewartet wird, aber Condition Y (innere) signalisiert wird.
Hättet ihr eine Idee. Ich möchte wie gesagt unterscheiden, dass genau 1 Thread weiterlaufen darf zu, dass alle weiter laufen dürfen.
Sofern ich nun per pthread_cond_broadcast() signalisierte, dass alle weiterlaufen dürfen, müsste ich auf irgendeine variable hin überprüfen. Jedoch bleibt deren wert auch dann ja bestehen, wenn alle weiter laufen sollen.
thx
vielleicht ist es ja gar nicht so ein komplexes Problem, aber ich mache nun schon etwas länger damit rum und habe keine Lösung gefunden.
Ich habe mehrere Threads (alle vom gleichen Typ) und führen mit unterschiedlichen Daten genau die gleiche Funktion aus, die bedingt durch eine Condition per pthread_cond_wait() warten müssen.
T1 T2 T3 T4 T5
w w w w w w = warten auf die gleiche Bedingung
Sofern nun ein Zeitpunkt kommt (Ereigniss A) sollen alle wieder weiterlaufen. Dies ist kein Problem, indem ich per pthread_cond_broadcast() alle "schlafenden" Threads wecke und diese ihre Arbeit erledigen. Da die Funktionen die diese aufrufen, lange brauchen, habe ich mehrere Synchronisationspunkte eingebaut, bei denen die jeweiligen Threads die Condition abfragen und gegebenfalls sich schlafen legen müssen.
Das Problem ist nun, dass ich genau einen Thread davon weiterlaufen lassen will wenn Ereignis B eintritt. Sofern ich nun alle wecken würde mittels pthread_cond_broadcast() und nur angenommen T4 weiterlaufen lassen will, wie könnte ich das anstellen. Also alle anderen Threads sollen weiter schlafen bleiben. Sofern Ereignis A zu einem späteren Zeitpunkt eintritt sollen alle wieder weiterlaufen.
T1 T2 T3 T4 T5
w w w w w w = warten auf die gleiche Bedingung
w w w w w
w w w w w
w w w w w
w w w w w Ereignis B
w w w a w a = Thread 4 läuft weiter ab, aber alle anderen sollen weiter schlafen
w w w a w
w w w a w
w w w a w
w w w a w
w w w - w - = Thread 4 ist fertig geworden
w w w - w
w w w - w
w w w - w
w w w - w
w w w - w
w w w - w Ereignis A
a a a - a
a a a - a
a a a - a
a a a - a
- - - - - - = alle anderen Threads sind nun fertig geworden.
Ich hatte mir gedacht, dass ich das über mehrere Condition-Variablen machen muss, man kann aber ja nur auf eine immer nur warten, d.h. eine Verschachtelung von pthread_cond_wait() bringt nicht, wenn auf Condition X (äußere) gewartet wird, aber Condition Y (innere) signalisiert wird.
Hättet ihr eine Idee. Ich möchte wie gesagt unterscheiden, dass genau 1 Thread weiterlaufen darf zu, dass alle weiter laufen dürfen.
Sofern ich nun per pthread_cond_broadcast() signalisierte, dass alle weiterlaufen dürfen, müsste ich auf irgendeine variable hin überprüfen. Jedoch bleibt deren wert auch dann ja bestehen, wenn alle weiter laufen sollen.
thx