2012-11-23 182 views
2

这是关于在这种情况下的适用性或消息队列,共享内存的适用性的适用性或消息队列,共享内存的适用性:关于在这种情况下

  1. 多个DLL或共享库

  2. 每个库都会尝试与我的主应用程序DLL或共享库进行通信,例如,所有DLL或共享库的I/P to和O/P将通过我的主应用程序的共享库进行通信。这些通信是异步的。

  3. 除了我的应用程序的.so以外,某些DLL或共享库将创建多个线程,并且每个此类线程的输出都需要传回给我的应用程序库。这些线程的输出又是异步的。

  4. 我的主要应用程序DLL /。所以将继续与这极有可能是它与一些服务器通过网络进行通信,并据此

  5. 响应所有其他DLL /的.so的的运作的其他工作都异步

Q-1:在上述哪种情况下最适合? (I)消息队列,(II)共享内存?

Q-2:任何引用或链接强制使用共享内存的几个共享库之间的同步?

+0

关于Q2 - (对不起,第一次链接错误)http://stackoverflow.com/questions/13512170/communication-using-shared-memory-between-vc-and-qt-applications/13512505#13512505 – Caribou

+1

关于Q1 - 取决于用例 - 您需要交易功能,Garenteed交付?使用MQ,但共享内存速度更快,需要更多配件 – Caribou

+0

感谢Caribou的回复,我无法在此使用任何第三方软件,如MQ。尽管与消息队列相比,共享内存更快并且可以提供更多空间,但同步正在扰乱我。 – indranil

回答

1

我想你的对问题的理解是错误的:

  • 共用存储器是一个“通道”来连接不同的工艺,如套接字,管道,或普通存储空间。
  • 消息队列是用于传递消息的“协议”,如TC​​P或环形缓冲区。您可以在共享或“正常”内存中通过套接字(如0MQ)或同步队列(如Intel TBB,请参见下文)创建它。

您不需要与您提供的规格共享内存。如果满足下列条件之一为真共享内存是非常有用的:

  • 您有几种方法(不这样做,你所有的这样/ dll文件将共享相同的内存)
  • 你需要坚持的记忆您的如果它崩溃(你可能需要但没有提到)。

现在,您需要为您的代码选择一个协议来讨论它。我建议使用英特尔线程构建模块(TBB,这将回答Q2)。它们提供了不同的抽象层次来满足你想要实现的目标,但是我不知道为你选择什么,尽管如此,需要一些时间来阅读(长)文档。

+0

1.共享内存不是管道。它是,呃共享内存。就像,相同的内存将出现在不同进程的地址空间中。 2.共享内存与持久性无关。也许你正在考虑内存映射文件? – Bryan

+0

@Bryan你从字面上看我的回答wayyyy。管道周围的引号应该暗示我并不是指“unix管道”。我的意思是“沟通渠道”。我的错误的措辞。然后,共享内存与持久性有关。重点是持久性不限于磁盘。如果您为SHM区域提供一个名称,它将在整个流程中保持不变(想象一下,如果它在第一个使用它的进程崩溃时会死掉会发生什么)。 –

+0

我很高兴你澄清。 – Bryan

0

由于我只理解你的应用程序的最一般意义上的警告,我认为消息队列是一个更简单的提供你传递的消息是有界的,适合于队列。

您似乎关心的两个主要问题是同步和异步。(1)POSIX消息队列具有已经内置的队列同步。这是一个很大的头痛被删除。 (2)在Linux下,队列ID mqd_t是一个文件描述符,这意味着它可以在select语句中使用。这照顾了异步问题。在您的主DLL中,您可以在select语句中为您的所有队列加载mqd_t描述符,并在您的DLL消息到达时使用一致的,调试和良好理解的机制来处理它们。 (3)与共享内存相比,丢失效率的微小比特(对大多数应用程序而言很小)不仅仅取决于msg队列使用的相对容易程度,以及您的主应用程序DLL将花费相对较多无论如何,长时间等待网络I/O与服务器。

+0

谢谢Duck,你说得对,我很担心同步和异步。那么消息队列已经建立了同步,但在涉及多个DLL /共享库的情况下使用消息队列是一个好主意吗?并且在任何时间点数据量都可能很大,有时它可能是一个小字符串,有时它可能在100 MB甚至1 GB,因此在这种情况下,由消息队列提供的存储容量就足够了?无论如何,再次感谢有见地的观点。 – indranil

+0

@Iranranil - 不,考虑到MQ可能不适合的那种数据。您可以采取一些措施避免将太多数据复制到队列中 - 例如,在堆上分配数据,只是在队列中传递一个ptr和一个长度 - 但是从你说你可能更好用其他机制。 – Duck