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

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

  1. 多个DLL或共享库

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

  3. 一些DLL或共享库,除了我的应用程序的.so,将创build多个线程,每个这样的线程的输出需要传回到我的应用程序库。 这些线程的输出又是asynchronous的。

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

  5. 所有其他DLL / .so的function是asynchronous的

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

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

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

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

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

  • 你有几个进程(你不这样做,你所有的/ DLL将共享相同的内存)
  • 如果崩溃,你需要坚持你的过程的记忆(你可能需要,但没有提到)。

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

有了这个告诫,我只能理解你的应用程序的最普遍的意义,我认为消息队列是一个没有脑子提供你所传递的消息是有界的,适合队列。

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