C Pthread - C - Ablaufen genau eines Threads während andere warten

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
 
Warum gibst du einen Thread nicht einen Status mit wo du ihm sagst er soll halt nicht auf die Condition warten.
Oder überseh ich das was bei der Problemstellung?
 
Das Problem ist, dass es nicht immer der gleiche Thread sein wird, der weiterlaufen soll, sondern mal der eine, mal der andere. Ich möchte das nutzen, um einen blockierten (genau einen) zu beenden eigentlich und während er auf die Condition wartet, kann ich ihn ja nicht beenden. Mit Beenden meine ich nicht wirklich killen, weil meine Threads in einer Endlosschleife auf Arbeiten (Jobs) von einer Jobqueue (warteschlange) warten und immer Auftrage absolvieren. Zu einem gegebenen Zeitpunkt soll nun genau ein gewisser Thread (bzw. der eine gewisse Aufgabe erledigt) beenden, also die Aufgabe abbrechen. Der Thread soll wieder auf neue Jobs warten bzw. ist dannach schlafend, sofern nicht alle weiterlaufen dürfen.
 
Wie wird entschieden wer weitermacht?
per zufall?
falls ja, warum? Ist es nicht einfacher zu definieren wer weitermachen soll?

Alternative:
einen Zähler teilen,
Wieviel Threads gerade was tun.
wenn der Zähler auf eins ist, weiß ich das alle andere in Warteposition sind und ich mache weiter. falls nicht, -1 und ich leg mich in warteposition.

Welcher Thread drankommt hängt dann "zufällig" vom Scheduler ab. also der letzte der den Warteauftrag bekommt.

natürlich musst du diese Zähler variable über eine critical section sichern.
Vielleicht geht es auch direkt über semaphore, da hab ich jetzt keine Lust das genau durchzudenken :(
 
Eventuell solltest du einfach einmal beschreiben, welches Problem du lösen willst, statt nach einer Lösung für deine "Problemlösung" zu suchen. Denn die klingt sehr stark nach "von hinten durch die Brust ins Auge".
 
Zurück
Oben