2010-01-27 128 views
3

我想,以取代自定义的队列一些线程通信,生产商目前 PostThreadMessage,消费者正在使用WaitForSingleObject的/的PeekMessage。阻塞队列Ç

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

不想要重新实现车轮,没有人有这样的用C语言实现一个队列?

+0

队列不是问题。问题在于找到一种机制来轮询接收线程中的队列,该队列不涉及昂贵或笨拙的忙等待循环。你很难找到一个替代windows消息循环。 – 2010-01-27 12:38:10

+0

你不想要一个繁忙的循环,这是肯定的。使用较新的Windows版本,您可以使用条件变量,而较老的则使用信号量或事件句柄。 OP基本上是要求一个非C++/boost版本的链接代码,这个代码已经有人编写了,哪个是* working * – nos 2010-01-27 12:52:13

回答

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 
+0

他们是重量级的。与自定义队列*可能相比,相当多。您不能(轻易地)指定语义,如最大排队元素,当达到该限制时队列应该如何表现。你不能让每个线程超过1个排队等 – nos 2010-01-27 12:21:09

+0

嗯,我会编辑,以解决这些具体意见 – Will 2010-01-27 12:37:02

+0

谢谢,但我真的不想找伪代码。我可以自己实现这一点,并花费几天时间调试竞态条件和死锁(如果您还希望生产者在给定的限制内阻塞,支持多个生产者,在内存池中调用内部队列节点,这些事情会变得非常复杂减少内存管理开销等) - 但我希望尽可能避免这种情况。我只想看看有没有人有现有的解决方案。 – Anonym 2010-01-27 13:00:15

5

使用IO完成端口(见here)为您的队列;它们不需要仅与I/O操作相关,并且由于内核可以设置为限制在线程池中运行的线程数的方式,因此非常易于使用和执行得非常好。

基本上你叫PostQueuedCompletionStatus()把项目队列和GetQueuedCompletionStatus()把他们赶走。你不需要担心同步等。

如果你需要更多的帮助来使它工作,那么你可以看看我的free high performance server framework,其中包括很多的IOCP代码,包括一个独立的线程与I/O无关的池。请注意,这是用C++编写的,但它应该能让你很好地理解C API如何挂在一起。

+0

用于io完成端口的+1。如果你的代码只有Windows,它们是一个很好的机制。 os为你做了很多很好的管理。我们在Adobe使用它们很多。 – tony 2010-01-28 03:25:24

+0

用于io完成端口的+1。它是一个简单API的复杂名称。它很容易被推迟,直到你意识到你*可以*传递NULL或零几乎每一个参数,并忽略处理文件IO相关的文档中的所有内容。 当然,他们确实使用自己的拜占庭内部逻辑 - 这就是为什么你需要仔细检查你的工作线程,以确保他们实际上被调用。 – 2010-01-28 04:27:07