这是关于在这种情况下消息队列与共享内存的适用性或适用性:
多个DLL或共享库
每个库将尝试与我的主应用程序DLL或共享库进行通信,例如,所有DLL或共享库的I / P到O / P将通过我的主应用程序的共享库进行通信。 这些通信是asynchronous的。
一些DLL或共享库,除了我的应用程序的.so,将创build多个线程,每个这样的线程的输出需要传回到我的应用程序库。 这些线程的输出又是asynchronous的。
我的主要应用程序DLL / .so将继续与其他工作,这很可能是通过networking与一些服务器通信,并作出相应的响应
所有其他DLL / .so的function是asynchronous的
Q-1:在上述哪种情况下最合适? (I)消息队列,(II)共享内存?
Q-2:使用共享内存在几个共享库之间强制同步的任何引用或链接?
我猜你对这个问题的理解是错误的:
您不需要与您提供的规格共享内存。 如果满足以下条件之一,则共享内存很有用:
现在,您需要为您的代码选择一个协议来讨论它。 我建议使用英特尔线程构建模块( TBB ,可以回答Q2)。 他们提供了不同层次的抽象,以达到你想要达到的目的,但是我不知道为你选择什么,尽管如此,需要一些时间来阅读(长)文档。
有了这个告诫,我只能理解你的应用程序的最普遍的意义,我认为消息队列是一个没有脑子提供你所传递的消息是有界的,适合队列。
你似乎关心的两件事情是同步和异步。 (1)POSIX消息队列具有已经内置的队列同步。 这是一个很大的头痛被删除。 (2)在Linux下,队列ID mqd_t是一个文件描述符,这意味着它可以在select
语句中使用。 这需要关心异步问题。 在您的主DLL中,您可以在select
语句中加载所有队列的mqd_t描述符,并在您的DLL消息到达时使用一致,调试和良好理解的机制来处理它们。 (3)与共享内存相比,丢失效率的微小的一点(对于大多数应用程序来说是微小的)不仅仅是msg队列使用的相对容易度,以及您的主应用程序DLL将花费相对较多无论如何,长时间等待与服务器的网络I / O。