Es gibt nichts zu stoppen Sie jede Art von komplexer Erzeuger-Verbraucher-Klasse bauen Sie wollen, aber es kann nicht-trivial sein:
1) einen Mutex, um den Zugriff auf die Thread-Management-Daten steuern sowohl für Hersteller und Verbraucher-Threads.
2) Innerhalb des Mutex, verwenden Sie, was auch immer komplexe Algorithmen/Container/was auch immer zu tun - es ist schön und sicher in dort.
3) Wenn ein Thread dann herausfindet, dass er aus irgendeinem Grund nicht fortfahren kann, sollte er einen Semaphor erhalten, ihn in den Verwaltungsdaten speichern, den Mutex beenden und auf den Semaphor warten.
4) Wenn ein Thread möglicherweise eine Ressource freigeben muss, die möglicherweise einen anderen Thread ausführen lässt, sollte er den Mutex eingeben, die Verwaltungsdaten analysieren und, wenn er einen Thread findet, der jetzt ausgeführt werden darf ihr Semaphor vor dem Verlassen des Mutex.
Beachten Sie, dass dies eine generische Version von 'My Weird Thread Locking/Management Requirement Thingy' ist. Es umfasst Madcademic WonderContainers, (Sie müssen eine Variable-Geometrie, Multi-Level-Feedback-Superqueue wie unten definiert verwenden ..), Crazed Multiple-Resource-Constraints, (Thread AB24 kann nur laufen, wenn es 5 Autos hat, drei Parkplatz-Poller, zwei rosa Zahnbürsten und ein explodierender Selbstmordgürtel) und all die anderen seltsamen und wunderbaren Dinge, die sich Professoren mit einer Flasche Tequila an einem Freitagnachmittag ausgedacht hatten.
Im Allgemeinen, nein. IME, die Thread-Container für Semaphore sind FIFO-Warteschlangen. Ich denke, wenn du die Quelle hast, z. Unter Linux könnten Sie eine andere Listenklasse verwenden, wenn Sie aus irgendeinem Grund (?) möchten. –