c – 消息队列在线程通信中对共享数据的优势是什么?

我读了一篇关于多线程程序设计 http://drdobbs.com/architecture-and-design/215900465文章,它说这是“用异步消息替换共享数据的最佳实践.尽可能地,更喜欢保持每个线程的数据被隔离(非共享),并让线程通过异步消息进行通信”传递数据副本“.

令我困惑的是,我没有看到使用共享数据和消息队列之间的区别.我现在正在开发一个关于Windows的非gui项目,所以让我们使用windows的消息队列.并以传统的生产者 – 消费者问题为例.

使用共享数据,将有一个共享容器和一个锁定生产者线程和消费者线程之间容器的锁.当生产者输出产品时,它首先等待锁定然后向容器写入内容然后释放锁定.

使用消息队列,生产者可以简单地PostThreadMessage而不用阻塞.这是异步消息的优势.但我认为必须存在一些锁定两个线程之间的消息队列,否则数据肯定会被破坏. PostThreadMessage调用只是隐藏细节.我不知道我的猜测是否正确但是如果它是真的,优势似乎不再存在,因为两种方法都做同样的事情,唯一的区别是系统在使用消息队列时隐藏细节.

PS.也许消息队列使用非阻塞包含器,但我也可以使用前一种方式的并发容器.我想知道消息队列是如何实现的,这两种方式之间是否有任何性能差异?

更新:@H_403_11@如果消息队列操作仍然在其他地方被阻止,我仍然不会得到异步消息的概念.如果我猜错了,请纠正我:当我们使用共享容器和锁时,我们将在我们自己的线程中阻塞.但是当使用消息队列时,我自己的线程立即返回,并将阻塞工作留给某个系统线程.

解决方法

消息传递对于交换较少量的数据很有用,因为不需要避免冲突.实现比用于计算机间通信的共享内存容易得多.此外,正如您已经注意到的,消息传递的优势在于应用程序开发人员无需担心共享内存等保护的细节.

共享内存允许最大的通信速度和便利性,因为它可以在计算机内以内存速度完成.共享内存通常比消息传递更快,因为消息传递通常使用系统调用来实现,因此需要更耗时的内核干预任务.相反,在共享内存系统中,仅需要系统调用来建立共享内存区域.一旦建立,所有访问都被视为正常的内存访问,没有来自内核的额外帮助.

编辑:您可能希望实现自己的队列的一种情况是要生成和使用大量消息,例如日志记录系统.随着PostThreadMessage的实现,其队列容量是固定的.如果超出容量,消息将最容易丢失.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...