为win32 / C阻塞线程生产者/消费者的队列

我正在尝试用自定义队列替换一些线程通信,生产者当前正在使用PostThreadMessage,消费者正在使用WaitForSingleObject / PeekMessage。

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html将是我所需要的,但是boost和C ++不是一个选择。

不想重新实现轮子,是否有人在C中实现了这样的队列?

使用IO完成端口(请参阅此处 )作为队列; 它们不需要与I / O操作相关,并且非常易于使用并且执行得非常好,因为可以设置内核来限制线程池中运行的线程数。

基本上你调用PostQueuedCompletionStatus()将项目放在队列上,并调用GetQueuedCompletionStatus()来取消它们。 您无需担心同步等问题。

如果你需要更多的帮助来使它工作,那么你可以看看我的免费高性能服务器框架 ,其中包括相当多的IOCP代码,包括一个与我无关的独立线程池/ O。 请注意,这是在C ++中,但它应该让您很好地了解C API如何挂起。

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