2016-04-30 18 views
4

Ich muss mehrere Threads synchronisieren (mit POSIX-Threads). Außerdem verwende ich Zustandsvariablen (Monitore), um dies zu erreichen.Synchronisieren von Threads mit Bedingungsvariablen (Monitoren)

Das Problem ist, dass ich eine "first come first served" Strategie implementieren muss. Angenommen, mehrere Threads warten darauf, dass ein anderer Thread diese Zustandsänderung signalisiert. Setzt der Aufruf pthread_cond_wait die Threads selbst in eine Warteschlange oder sollte ich eine explizite Warteschlange definieren, um dies zu erreichen? Eine mögliche Lösung hierfür könnte auch die Verwendung von Sperren sein.

+0

Was ist die "first come first served" Strategie? Die Threads oder die von ihnen erzeugten Daten? Wenn es um Threads geht - überdenken Sie Ihr Design (es sei denn, es ist eine akademische Aufgabe zu beweisen, dass Sie wissen, was Sie tun). Wenn es um Daten geht - einfach die Daten in die Warteschlange stellen und die Warteschlange verarbeiten. – ArturFH

Antwort

0

Die Pthreads-API garantiert keine Fairness für die pthread_cond_wait + pthread_cond_signal/pthread_cond_broadcast Combo. Die spec heißt es ausdrücklich, dass die Planungsrichtlinie die Reihenfolge bestimmen, in der die wartenden Threads aufwachen:

Wenn mehr als ein Thread auf einer Zustandsgröße blockiert ist, wird die Planungsrichtlinie die Reihenfolge bestimmen, in den Fäden nicht blockiert.

Wenn Sie nicht wollen, auf den Scheduler verlassen (auch wenn es ein, dass has "aged well" like Linux' CFS ist), müssen Sie den Parkplatz kontrollieren und Entparken selbst.

Wie für die Implementierung einer fairen Warteschlange, können Sie auf einem bauen.