POSIX-Threads und Fairness (Semaphoren)

Ich habe ein Programm in C erstellt, das 2 Puffer erstellt. Die Pufferindizes enthalten einzelne Zeichen, 'A' oder 'b' usw. Um mehr über Multithreading zu erfahren, habe ich eine Reihe von Semaphoren erstellt, die auf dem Erzeuger- / Verbraucherproblem basieren, um Zeichen zu erzeugen und Zeichen aus den Puffern zu verbrauchen. Ich habe 3 Producer-Threads für jeden Puffer und 10 Consumer-Threads. Die Konsumenten entnehmen aus jedem Puffer einen Artikel und melden ihn dann (wodurch auch der Speicher des konsumierten Artikels freigegeben wird). Nun, nach dem, was ich gelesen habe, soll sem_wait () den "längsten wartenden Thread" signalisieren, wenn er aus einem blockierenden Zustand kommt (ich habe dies in einem Buch und in einer Online-POSIX-Bibliothek gelesen).

Ist das nun wirklich wahr?

Der Antrag, den ich gestellt habe, sollte sowohl Verbraucher als auch Erzeuger am selben sem_wait () - Gate warten lassen, aber die Erzeuger geraten mehr als doppelt so schnell in den kritischen Bereich wie Verbraucher. Die Verbraucher müssen auf ein zusätzliches Semaphor warten, aber das sollte keinen großen Unterschied machen. Ich kann anscheinend nicht herausfinden, warum es passiert, also hoffe ich, dass es jemand anderes tut. Wenn ich auf den Produzententhreads schlafe (1), kommen die Konsumenten in Ordnung und die Puffer schweben um 0 Elemente ... wie ich es mir anders vorstellen würde.

Sollte die Reihenfolge der Thread-Erstellung auch eine Rolle bei der Strukturierung des Programms für Fairness spielen?

IE, produzieren Sie eine von jedem Typ in einer Round-Robin-Mode, bis alle erstellt und ausgeführt werden.

Gibt es Methoden, die mir jemand beschreiben kann, um ein faireres System für den Thread-Zugriff einzuführen? Ich habe gelesen, dass das Erstellen eines FIFO-Warteschlangensystems eine Lösung sein könnte, bei der der am längsten wartende Thread die höchste Priorität hat (was meiner Meinung nach sem_wait () sowieso tun würde).

Ich frage mich nur, welche Methoden es für rudimentäres und übergeordnetes Threading gibt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage