Sur les quelques occasions dont j'ai eu besoin pour implémenter ma propre file de messages, j'ai tendance à utiliser 1 sémaphore et 1 mutex (ou sémaphore) pour chaque file d'attente. J'ai seulement traité des files d'attente de niveau de thread, ainsi ceci probablement ne s'applique pas si vous voulez une file d'attente entre deux processus. Le sémaphore est utilisé pour compter le nombre de messages dans la file d'attente et fournir le mécanisme du système d'exploitation pour que le thread suspende/attende les nouveaux messages.
Le mutex est utilisé pour protéger la structure globale de la file d'attente.
Ainsi, il peut paraître un peu comme ça (très 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
}
Cependant, peut-être ce n'est pas très "poids léger". Cela suppose également que les files d'attente ne sont pas détruites pendant l'utilisation. En outre, je soupçonne qu'avec une file d'attente "WORD" seulement, il pourrait y avoir quelques optimisations.
Si vous cherchez un "code sans verrouillage", alors je suggère de passer un jour ou deux à lire ces articles by Sutter.
Bonne chance!
Pour ceux d'entre nous qui ne sont pas familiers avec iTron, pourriez-vous nous indiquer un lien qui décrit cette "file d'attente de données"? –