我正在尝试用自定义队列替换一些线程通信,生产者当前正在使用 PostThreadMessage,使用者正在使用WaitForSingleObject / PeekMessage。
http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html将是我所需要的,但是升级和C ++都不是一种选择。
不想重新实现轮子,是否有人在C中实现了这样的队列?
答案 0 :(得分:6)
使用IO完成端口(请参阅here)作为您的队列;它们不需要仅与I / O操作相关,并且非常易于使用并且执行得非常好,因为可以设置内核来限制线程池中运行的线程数。
基本上,您拨打PostQueuedCompletionStatus()
将项目放入队列,然后GetQueuedCompletionStatus()
将其取消。您无需担心同步等问题。
如果您需要更多帮助才能使其工作,那么您可以查看我的free high performance server framework,其中包含相当多的IOCP代码,包括与任何内容无关的独立线程池通往I / O的方式。请注意,这是在C ++中,但它应该让您很好地了解C API如何挂起。
答案 1 :(得分:1)
PostThreadMessage/WaitForSingleObject
是在win32上的线程之间进行消息队列排队的合适方法。
您也可以使用SetEvent()
(来自制作人)和WaitForSingleObject()
(或WaitForMultipleObjects()
,如果有多个队列)(在消费者中)发送一个标记,说明自定义队列'写的有项目。
以下伪代码描述了这种方法:
in producer...
...
create item
acquire_lock
push item onto queue
release_lock
SetEvent(...)
...
in consumer...
while(true)
WaitForSingleObject(event)
acquire_lock
pop item from queue
release_lock
process item
release item