令我困惑的是,我没有看到使用共享数据和消息队列之间的区别.我现在正在开发一个关于Windows的非gui项目,所以让我们使用windows的消息队列.并以传统的生产者 – 消费者问题为例.
使用共享数据,将有一个共享容器和一个锁定生产者线程和消费者线程之间容器的锁.当生产者输出产品时,它首先等待锁定然后向容器写入内容然后释放锁定.
使用消息队列,生产者可以简单地PostThreadMessage而不用阻塞.这是异步消息的优势.但我认为必须存在一些锁定两个线程之间的消息队列,否则数据肯定会被破坏. PostThreadMessage调用只是隐藏细节.我不知道我的猜测是否正确但是如果它是真的,优势似乎不再存在,因为两种方法都做同样的事情,唯一的区别是系统在使用消息队列时隐藏细节.
PS.也许消息队列使用非阻塞包含器,但我也可以使用前一种方式的并发容器.我想知道消息队列是如何实现的,这两种方式之间是否有任何性能差异?
更新:
如果消息队列操作仍然在其他地方被阻止,我仍然不会得到异步消息的概念.如果我猜错了,请纠正我:当我们使用共享容器和锁时,我们将在我们自己的线程中阻塞.但是当使用消息队列时,我自己的线程立即返回,并将阻塞工作留给某个系统线程.
解决方法
共享内存允许最大的通信速度和便利性,因为它可以在计算机内以内存速度完成.共享内存通常比消息传递更快,因为消息传递通常使用系统调用来实现,因此需要更耗时的内核干预任务.相反,在共享内存系统中,仅需要系统调用来建立共享内存区域.一旦建立,所有访问都被视为正常的内存访问,没有来自内核的额外帮助.
编辑:您可能希望实现自己的队列的一种情况是要生成和使用大量消息,例如日志记录系统.随着PostThreadMessage的实现,其队列容量是固定的.如果超出容量,消息将最容易丢失.