В тех немногих случаях, когда мне нужно было реализовать собственную очередь сообщений, я склонен использовать 1 семафор и 1 мьютекс (или семафор) для каждой очереди. Я имел дело только с очередями на уровне потоков, так что это, вероятно, неприменимо, если вы хотите очередь между двумя процессами.
Семафор используется для подсчета количества сообщений в очереди и обеспечения механизма ОС для потока, который приостанавливает / ожидает новые сообщения.
Мьютекс используется для защиты общей структуры очереди.
Итак, это может выглядеть примерно так (очень много псевдокода):
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
}
Однако, возможно, это не очень "легкий вес". Это также предполагает, что очереди не уничтожаются во время использования. Кроме того, я подозреваю, что в очереди «WORD» возможны некоторые оптимизации.
Если вы ищете «Код без блокировки», то я предлагаю провести день или два, читая эти статьи Саттера .
Удачи!