Zu den wenigen Gelegenheiten, die ich benötigt habe, um meine eigene Nachrichtenwarteschlange zu implementieren, tendiere ich dazu, 1 Semaphor und 1 Mutex (oder Semaphor) für jede Warteschlange zu verwenden. Ich habe mich nur mit Thread-Level-Queues beschäftigt, daher trifft dies wahrscheinlich nicht zu, wenn Sie eine Warteschlange zwischen zwei Prozessen haben wollen.
Der Semaphor wird verwendet, um die Anzahl der Nachrichten in der Warteschlange zu zählen und den OS-Mechanismus für den Thread bereitzustellen, der neue Nachrichten aussetzen/warten soll.
Der Mutex wird zum Schutz der gesamten Warteschlangenstruktur verwendet.
So könnte es ein bisschen so aussehen (sehr viel Pseudo-Code):
DataQueueRx(Queue*, WORD*, timeout?)
{
WaitOnSemaphore(Queue->sema, timeout?); //get token
LockMutex
{
//manipulate your queue, and transfer the data to WORD
}
ReleaseMutex
}
DataQueueTx(Queue*, WORD)
{
LockMutex
{
//manipulate your queue, inserting new WORD msg
ReleaseSemaphore(Queue->sema); //increment semaphore count
}
UnlockMutex
}
Aber vielleicht das „Gewicht Licht“ nicht sehr ist. Dies setzt auch voraus, dass Warteschlangen während der Verwendung nicht zerstört werden. Außerdem vermute ich, dass mit einer "WORD" nur Warteschlange, könnte es einige Optimierungen geben.
Wenn Sie "Lock-free-Code" suchen, dann schlage ich vor, verbringen Sie einen oder zwei Tage durch diese articles by Sutter lesen.
Viel Glück!
Für diejenigen von uns, die nicht mit iTron vertraut sind, könnten Sie uns bitte auf einen Link verweisen, der diese "Daten-Warteschlange" beschreibt? –