繁体   English   中英

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

[英]Regarding the applicability or suitability of message queue vs. Shared Memory in this situation

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

  1. 多个DLL或共享库

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

  3. 除了我的应用程序的.so之外,某些DLL或共享库将创建多个线程,每个这样的线程的输出都需要传递回我的应用程序库。 这些线程的输出再次是ASYNCHRONOUS。

  4. 我的主应用程序DLL / .so将继续其其他工作,这很可能是它与网络上的某些服务器进行通信,并因此做出了响应

  5. 所有其他DLL / .so的功能都是异步的

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

问题2:是否有任何引用或链接使用共享内存在多​​个共享库之间强制进行同步?

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

  • 共享内存是连接不同进程(例如套接字,管道或普通内存)的“通道”。
  • 消息队列是用于传递消息的“协议”,例如TCP或环形缓冲区。 您可以通过套接字(如0MQ)或在共享或“正常”内存中使用同步队列(如Intel TBB,请参见下文)来创建它。

您不需要共享具有给定规格的内存。 如果满足以下条件之一,则共享内存很有用:

  • 您有几个进程(您没有,所有的so / dll将共享相同的内存)
  • 如果进程崩溃,则需要保留该进程的内存(您可能需要,但未提及)。

现在,您需要为您的代码选择协议以进行讨论。 我建议使用Intel Thread Building Blocks( TBB ,它将回答Q2)。 它们为您要实现的目标提供了不同的抽象层,尽管您花些时间阅读(冗长的)文档,但我所知还不足以为您选择。

需要说明的是,我仅从最一般的意义上理解您的应用程序,因此我认为消息队列是不费吹灰之力, 只要您传递的msgs有界且适合与队列一起使用。

您似乎关心的两个主要方面是同步和异步。 (1)POSIX消息队列已内置队列同步。 那是消除的一大头疼。 (2)在Linux下,队列ID mqd_t是文件描述符,这意味着它可以在select语句中使用。 这就解决了异步问题。 在主DLL中,您可以在select语句中为所有队列加载mqd_t描述符,并在它们到达时以一致,调试和易于理解的机制处理DLL消息。 (3)与共享内存相比,您损失的一点点效率(对于大多数应用程序来说都是微不足道的),远远超过了msg队列使用的相对简便性以及您的主应用程序DLL将花费相对较少的事实所弥补。无论如何,长时间等待服务器的网络I / O。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM