当然,有无锁队列。但是,根据您在评论中所说的,这里的性能并不重要,因为无论如何您都是在每次写入时创建一个线程。
因此,这是条件变量的标准用例。让自己成为一个包含互斥体、条件变量、链表(或循环缓冲区,如果你愿意)和取消标志的结构:
write:
lock the mutex
(optionally - check the cancel flag to prevent leaks of stuff on the list)
add the event to the list
signal the condition variable
unlock the mutex
read:
lock the mutex
while (list is empty AND cancel is false):
wait on the condition variable with the mutex
if cancel is false: // or "if list non-empty", depending on cancel semantics
remove an event from the list
unlock the mutex
return event if we have one, else NULL meaning "cancelled"
cancel:
lock the mutex
set the cancel flag
(optionally - dispose of anything on the list, since the reader will quit)
signal the condition variable
unlock the mutex
如果您使用带有外部节点的列表,那么您可能希望在互斥锁之外分配内存,以减少其持有的时间。但是,如果您使用侵入式列表节点设计事件,那可能是最简单的。
编辑:如果取消您将“信号”更改为“广播”,您还可以支持多个阅读器(没有可移植保证哪个人获得给定事件)。尽管您不需要它,但它也并不真正花费任何费用。