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

时间:2010-01-27 11:52:42

标签: c multithreading winapi

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

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

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

2 个答案:

答案 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