这是关于在这种情况下消息队列与共享内存的适用性或适用性:
-
多个DLL或共享库
-
每个库都将尝试与我的主应用程序DLL或共享库通信,例如,所有DLL或共享程序库的I/p和O/p都将通过主应用程序的共享库进行通信。这些通信是异步的。
-
除了我的应用程序.so之外,一些DLL或共享库将创建多个线程,每个这样的线程的输出都需要返回到我的应用库。这些线程的输出再次为ASYNCHRONOUS。
-
我的主要应用程序DLL/.so将继续它的其他工作,这很可能是它通过网络与一些服务器通信,并相应地响应
-
所有其他DLL/.so的功能都是异步
Q-1:在上述情况下,哪一种最适合?(I) 消息队列,(II)共享内存?
问题2:是否有任何引用或链接强制使用共享内存在几个共享库之间进行同步?
我想你对这个问题的理解是错误的:
- 共享内存是连接不同进程的"通道",如套接字、管道或普通内存
- 消息队列是一种用于传递消息的"协议",如TCP或环形缓冲区。您可以通过套接字(如0MQ)或使用共享或"正常"内存中的同步队列(如Intel TBB,请参阅下文)创建它
您不需要指定规格的共享内存。如果以下情况之一为真,则共享内存是有用的:
- 您有几个进程(如果没有,所有的so/dll将共享相同的内存)
- 如果进程崩溃,您需要保留进程的内存(您可能需要,但没有提及)
现在,您需要为代码选择一个协议来讨论它。我建议使用英特尔线程构建块(TBB,这将回答Q2)。它们为你想要实现的目标提供了不同的抽象层,我不知道该为你选择什么,不过,需要一些时间来阅读(长)文档。
注意,我只从最一般的意义上理解您的应用程序,我认为消息队列是一个很容易的,只要您传递的消息是有界的,并且适合队列。
您似乎关心的两件主要事情是同步和异步。(1) POSIX消息队列已经内置了队列同步。这是一个大头痛消除。(2) 在Linux下,队列id mqd_t是一个文件描述符,这意味着它可以在select
语句中使用。这就解决了异步问题。在您的主DLL中,您可以在select
语句中加载所有队列的mqd_t描述符,并在DLL消息到达时使用一致的、经过调试且易于理解的机制进行处理。(3) 与共享内存相比,您损失的效率很小(对大多数应用程序来说也是很小的),这主要是由于消息队列使用的相对容易,以及您的主应用程序DLL无论如何都要花费相对较长的时间等待服务器的网络I/O。