2012-11-23 183 views
2

這是關於在這種情況下的適用性或消息隊列,共享內存的適用性的適用性或消息隊列,共享內存的適用性:關於在這種情況下

  1. 多個DLL或共享庫

  2. 每個庫都會嘗試與我的主應用程序DLL或共享庫進行通信,例如,所有DLL或共享庫的I/P to和O/P將通過我的主應用程序的共享庫進行通信。這些通信是異步的。

  3. 除了我的應用程序的.so以外,某些DLL或共享庫將創建多個線程,並且每個此類線程的輸出都需要傳回給我的應用程序庫。這些線程的輸出又是異步的。

  4. 我的主要應用程序DLL /。所以將繼續與這極有可能是它與一些服務器通過網絡進行通信,並據此

  5. 響應所有其他DLL /的.so的的運作的其他工作都異步

Q-1:在上述哪種情況下最適合? (I)消息隊列,(II)共享內存?

Q-2:任何引用或鏈接強制使用共享內存的幾個共享庫之間的同步?

+0

關於Q2 - (對不起,第一次鏈接錯誤)http://stackoverflow.com/questions/13512170/communication-using-shared-memory-between-vc-and-qt-applications/13512505#13512505 – Caribou

+1

關於Q1 - 取決於用例 - 您需要交易功能,Garenteed交付?使用MQ,但共享內存速度更快,需要更多配件 – Caribou

+0

感謝Caribou的回覆,我無法在此使用任何第三方軟件,如MQ。儘管與消息隊列相比,共享內存更快並且可以提供更多空間,但同步正在擾亂我。 – indranil

回答

1

我想你的對問題的理解是錯誤的:

  • 共用存儲器是一個「通道」來連接不同的工藝,如套接字,管道,或普通存儲空間。
  • 消息隊列是用於傳遞消息的「協議」,如TC​​P或環形緩衝區。您可以在共享或「正常」內存中通過套接字(如0MQ)或同步隊列(如Intel TBB,請參見下文)創建它。

您不需要與您提供的規格共享內存。如果滿足下列條件之一爲真共享內存是非常有用的:

  • 您有幾種方法(不這樣做,你所有的這樣/ dll文件將共享相同的內存)
  • 你需要堅持的記憶您的如果它崩潰(你可能需要但沒有提到)。

現在,您需要爲您的代碼選擇一個協議來討論它。我建議使用英特爾線程構建模塊(TBB,這將回答Q2)。它們提供了不同的抽象層次來滿足你想要實現的目標,但是我不知道爲你選擇什麼,儘管如此,需要一些時間來閱讀(長)文檔。

+0

1.共享內存不是管道。它是,呃共享內存。就像,相同的內存將出現在不同進程的地址空間中。 2.共享內存與持久性無關。也許你正在考慮內存映射文件? – Bryan

+0

@Bryan你從字面上看我的回答wayyyy。管道周圍的引號應該暗示我並不是指「unix管道」。我的意思是「溝通渠道」。我的錯誤的措辭。然後,共享內存與持久性有關。重點是持久性不限於磁盤。如果您爲SHM區域提供一個名稱,它將在整個流程中保持不變(想象一下,如果它在第一個使用它的進程崩潰時會死掉會發生什麼)。 –

+0

我很高興你澄清。 – Bryan

0

由於我只理解你的應用程序的最一般意義上的警告,我認爲消息隊列是一個更簡單的提供你傳遞的消息是有界的,適合於隊列。

您似乎關心的兩個主要問題是同步和異步。(1)POSIX消息隊列具有已經內置的隊列同步。這是一個很大的頭痛被刪除。 (2)在Linux下,隊列ID mqd_t是一個文件描述符,這意味着它可以在select語句中使用。這照顧了異步問題。在您的主DLL中,您可以在select語句中爲您的所有隊列加載mqd_t描述符,並在您的DLL消息到達時使用一致的,調試和良好理解的機制來處理它們。 (3)與共享內存相比,丟失效率的微小比特(對大多數應用程序而言很小)不僅僅取決於msg隊列使用的相對容易程度,以及您的主應用程序DLL將花費相對較多無論如何,長時間等待網絡I/O與服務器。

+0

謝謝Duck,你說得對,我很擔心同步和異步。那麼消息隊列已經建立了同步,但在涉及多個DLL /共享庫的情況下使用消息隊列是一個好主意嗎?並且在任何時間點數據量都可能很大,有時它可能是一個小字符串,有時它可能在100 MB甚至1 GB,因此在這種情況下,由消息隊列提供的存儲容量就足夠了?無論如何,再次感謝有見地的觀點。 – indranil

+0

@Iranranil - 不,考慮到MQ可能不適合的那種數據。您可以採取一些措施避免將太多數據複製到隊列中 - 例如,在堆上分配數據,只是在隊列中傳遞一個ptr和一個長度 - 但是從你說你可能更好用其他機制。 – Duck