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

win32/C线程生产者/消费者的阻塞队列,c,multithreading,winapi,C,Multithreading,Winapi,我试图用一个定制队列替换一些线程通信,producer当前正在使用 PostThreadMessage,使用者正在使用WaitForSingleObject/PeekMessage 将是我需要的,但是Boost和C++不是一个选项。 不想重新实现控制盘,有人用C实现了这样的队列吗?在win32上,PostThreadMessage/WaitForSingleObject是在线程之间进行消息队列的合适方法 您还可以使用SetEvent()(来自生产者)和WaitForSingleObject()(

我试图用一个定制队列替换一些线程通信,producer当前正在使用 PostThreadMessage,使用者正在使用WaitForSingleObject/PeekMessage

将是我需要的,但是Boost和C++不是一个选项。


不想重新实现控制盘,有人用C实现了这样的队列吗?

在win32上,PostThreadMessage/WaitForSingleObject是在线程之间进行消息队列的合适方法

您还可以使用
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
使用IO完成端口(请参阅)作为队列;它们不需要仅仅与I/O操作相关,而且非常易于使用,性能也非常好,因为内核可以设置为限制线程池中运行的线程数

基本上,您可以调用
PostQueuedCompletionStatus()
将项目放入队列中,然后调用
GetQueuedCompletionStatus()
将它们取下。您不需要担心同步等问题


如果你需要更多的帮助使它工作,那么你可以看看我的IOC代码,包括相当多的IOCP代码,包括一个独立的线程池,它与I/O无关。注意这是C++,但是它应该能让你更好地理解C API如何挂在一起。p> 他们是重量级的。与定制队列相比,这是一个相当大的优势。您不能(轻松地)指定语义,例如最大排队元素,以及达到该限制时队列应如何运行。每个线程不能有超过1个队列,等等。谢谢,但我并不是真的在寻找伪代码。我可以自己实现这一点,并花几天时间调试竞争条件和死锁(如果您还希望生产者在给定限制下阻塞、支持多个生产者、在内存池中处理内部队列节点以减少内存管理开销等,这些事情可能会变得相当复杂)-但如果可能的话,我想避免这样。我只是想看看是否有人有现成的解决方案。你肯定不希望有一个繁忙的循环。对于较新的windows版本,您可以使用条件变量;对于较旧的windows版本,您可以使用信号量或事件句柄。OP基本上要求的是有人已经编写的链接代码的非c++/boost版本,该版本正在为io完成端口使用+1。如果您的代码仅适用于windows,则它们是一种很好的机制。这个操作系统为你做了很多很好的管理。我们在Adobe中使用了很多,io完成端口使用+1。这是一个简单api的复杂名称。它很容易被推迟,直到您意识到您可以为几乎每个参数传递NULL或零,并忽略文档中与处理文件io相关的所有内容。当然,它们确实使用自己的拜占庭内部逻辑——这就是为什么需要仔细检查工作线程以确保它们确实被调用的原因。