2

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

  1. 多个 DLL 或共享库

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

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

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

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

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

Q-2:任何使用共享内存在多​​个共享库之间强制同步的参考或链接?

4

2 回答 2

1

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

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

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

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

现在,您需要为您的代码选择一个协议来讨论它。我建议使用 Intel Thread Building Blocks ( TBB,这将回答 Q2)。它们为您想要实现的目标提供了不同的抽象层,但我不知道如何为您选择,但需要一些时间来阅读(长)文档。

于 2012-11-23T14:32:15.443 回答
0

需要注意的是,我只在最一般的意义上理解您的应用程序,我认为消息队列是不费吹灰之力的,前提是您传递的消息是有界的并且适合与队列一起使用。

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

于 2012-11-23T16:19:23.610 回答