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

时间:2012-11-23 11:58:34

标签: c++ c linux operating-system shared-libraries

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

  1. 多个DLL或共享库

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我猜你对这个问题的理解是错误的:

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

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

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

现在,您需要为您的代码选择协议来进行对话。我建议使用英特尔线程构建模块(TBB,它将回答Q2)。它们为你想要达到的目标提供不同层次的抽象,但我不知道为你选择,但是,花一些时间阅读(长篇)文档。

答案 1 :(得分:0)

有一点需要注意,我只是在最一般意义上理解你的应用程序,我认为消息队列是一个简单的提供你传递的msgs是有界限的,适合于队列与

您似乎关注的两个主要问题是同步和异步。 (1)POSIX消息队列已经内置了队列同步。这是一个令人头疼的问题。 (2)在Linux下,队列id mqd_t是文件描述符,这意味着它可以在select语句中使用。这样可以解决异步问题。在您的主DLL中,您可以在select语句中为所有队列加载mqd_t描述符,并在它们到达时使用一致,调试且易于理解的机制处理您的DLL消息。 (3)与共享内存相比,您丢失的效率(与大多数应用程序相比很小)比使用msg队列相对容易以及主应用程序DLL将花费相对的事实更多无论如何,长时间等待网络I / O与服务器。