2010-07-26 116 views
0

我打算在Server(C++)和客戶端(C#應用程序)之間實現boost的共享內存。只有閱讀器和一個寫入器和數據共享(讀寫)的頻率是每毫秒數千次。實施共享內存時需要考慮的事項

涉及哪些風險?

+1

有關如何實現共享內存,請參見http://stackoverflow.com/questions/439787/how-to-implement-shared-memory-in-net。正如Steven Sudit所回答的,看起來您需要使用P/Invoke – 2010-07-26 18:27:16

回答

0

那麼,從.NET 3.5開始,就不支持共享內存。你必須使用P/Invoke,這很痛苦。更大的問題是C#的內存模型不利於與C++共享。

編輯

由於額外的風險,這將需要持有OS手柄,這意味着任何錯誤可能導致不會被任何東西短的查殺過程中固定泄漏。您可以通過使用SafeHandle而不是IntPtr來防止大部分此類情況。

5

每毫秒數千次不會說太多。如果它是一個字節的時間不是很多。如果更多..好,這一切都取決於多少。

我會建議不要共享內存。我會建議「不要通過共享來溝通,要通過溝通來分享」。如果一旦完成,分析表明額外的內存拷貝確實是瓶頸,那麼,也許一些基於互操作的共享內存解決方案就是解決方案。通常你會發現情況並非如此。

+2

好建議。我想補充一點,實際上,共享內存通常用於實現IPC機制的IPC版本。例如,TCP/IP到「本地主機」使用共享內存,命名管道爲「。」。通過使用這些通用機制,您可以獲得共享內存的大部分速度,具有消息傳遞體系結構的穩健性以及可擴展性。 – 2010-07-26 18:31:50

+0

到localhost的TCP/IP是否總是使用共享內存?這似乎與操作系統有關我很想知道哪些大三的桌面操作系統是這樣做的(Win/Mac/Lin)。 – 2010-07-26 20:54:13

+0

每更新大約100個字節是速率。 使用pinvoke等需要線程安全功能,如鎖定,因爲在mem共享這是不需要的。舉辦活動通常需要更長的時間。 – bsobaid 2010-07-27 01:44:41

1

我只想讓有關共享內存的意見一般

  1. 預期共享內存映射到虛擬內存中不同的地方。這意味着在一個進程和下一個進程之間傳遞指針是無用的,您必須使用共享內存基址中的偏移量
  2. 您將無法訪問malloc/new和釋放/刪除堆管理功能,但您確實有很好的塊內存來設置你自己的內存管理對象。
  3. 您必須設計一個清晰的所有權模型,哪個進程可以訪問哪一塊內存。
  4. 跨進程共享的對象(如記賬對象)的任何訪問都必須受互斥鎖保護
  5. 尋找最小化鎖定互斥鎖時所用時間的策略,freelists是你的朋友。
  6. 在任何生產者消費者模型中,確保您清楚地瞭解流量控制。您不得溢出或下溢共享空間。信號量是你的朋友。

我認爲關於它。我同意上面的說法,而是使用IPC來複制內存,除非你真的必須使用共享內存,這些缺陷可能會讓你活着。

+0

我相信這些問題,包括互斥是由提升庫照顧? – bsobaid 2010-07-27 15:48:54

+0

Boost確實提供了很多工具來幫助解決上述問題,但仍需要了解以上幾點 – doron 2010-07-28 10:12:08

相關問題