Frage

My aktuelles Verständnis der Zustandsgrößen ist, dass alle blockiert (Warte) Fäden in eine Grund FIFO-Warteschlange eingefügt werden, das erste Element von dem erwacht, wenn das Signal () aufgerufen wird.

Gibt es eine Möglichkeit, diese Warteschlange zu ändern (oder eine neue Struktur erstellen) als Prioritätswarteschlange statt durchführen? Ich habe für eine Weile darüber nachgedacht, aber die meisten Lösungen Ich habe am Ende durch die vorhandene Warteschlangenstruktur behindern inhärente C. V. ist und mutexes.

Danke!

War es hilfreich?

Lösung

Ich denke, Sie sollten überdenken, was Sie zu tun versuchen. Wenn Sie versuchen, Ihre Leistung zu optimieren, sind Sie wahrscheinlich den Holzweg.

pthread_cond_signal() ist nicht einmal garantiert genau einen Thread zu entsperren - es ist garantiert zu entsperren mindestens ein Thread, so dass Ihr Code besser in der Lage sein, die Situation zu behandeln, in denen mehrere Threads gleichzeitig deblockiert werden. Der typische Weg, dies zu tun, ist für jeden Thread des Zustand, nachdem er entsperrt erneut zu überprüfen, und, wenn dies nicht zutrifft, kehrt wieder zu warten.

Sie könnten eine Art Schema implementieren, wo Sie Ihre eigene Priorität Warteschlange von Threads warten lassen, und jeder Thread selbst unmittelbar zu dieser Warteschlange hinzugefügt, bevor es war Warten zu beginnen, und dann würde es die Warteschlange überprüfen, wenn Entsperrung, aber dies würde fügen viel Komplexität und viel Potential für ernste Probleme (Rennbedingungen, Deadlocks, etc.). Es wurde auch eine nicht-triviale Menge an Overhead hinzuzufügen.

Auch was passiert, wenn ein Thread mit höherer Priorität im selben Moment auf einer Bedingungsvariable beginnt wartet, dass Zustandsgröße signalisiert wird? Wer bekommt nicht blockiert, die neu angekommen hohe Priorität Thread oder den ehemaligen höchste Priorität Thread?

Die Reihenfolge, in Fäden unblockierten bekommen ist völlig abhängig von dem Thread-Scheduler des Kernels, so dass Sie an seiner Gnade sind. Ich würde FIFO Bestellung nicht einmal annehmen, auch nicht.

Andere Tipps

Da Bedingungsvariablen im Grunde nur eine Barriere ist, und Sie haben keine Kontrolle über die Schlange der wartenden Threads gibt es keine wirkliche Möglichkeit, Prioritäten zu übernehmen. Es ist ungültig Threads zu übernehmen wartet in einer FIFO-Weise wirken wird.

Mit einer Kombination aus atomics, zusätzlichen Zustandsgrößen und Vorwissen der Fäden / Prioritäten beteiligen Sie eine Lösung konstruieren könnte, wo ein signalisierte Thread wird das Master-CV erneut signalisieren und dann wieder Block auf einer CV Priorität, aber es sicherlich nicht eine generische Lösung. Das ist auch aus der Spitze von meinem Kopf, so könnte auch einen anderen Fehler haben.

Es ist der Scheduler, die ausgeführt werden soll Thread bestimmt. Sie können unter pthread_setschedparam und pthread_getschedparam und Geige mit der Politik (SCHED_OTHER, SCHED_FIFO oder SCHED_RR) und den Prioritäten. Aber es wird wahrscheinlich nicht bekommen Sie, wo ich vermute, dass Sie gehen wollen.

Es klingt, als ob Sie etwas wollen berechenbar aus dem von Natur aus nicht-deterministisch machen. Wie Andrew merkt man etwas, aber meine Vermutung hacken könnte, ist, dass dies zu Kummer oder vielen Code führen werden Sie sich für das Schreiben in sechs Monaten hassen (oder beides).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top