2010-07-07 35 views
12

我正在研究一個由內存映射文件支持的線程安全隊列,這些文件相當大地利用了boost進程。我提交它用於代碼審查,並且比我在這個星球上擁有更多年經驗的開發人員表示他並不認爲boost :: interprocess已經「準備好了黃金時間」,並且我應該直接使用pthread。boost :: interprocess是否準備好黃金時間?

我認爲這主要是FUD。我個人認爲去重新實現諸如upgradable_named_mutex或boost :: interprocess :: deque之類的東西已經無稽之談了,但我很想知道其他人的想法。我找不到任何數據來支持他的說法,但也許我只是不知情或天真。 Stackoverflow給我啓發!

回答

19

我試圖對一個項目使用boost :: interprocess,並帶着各種各樣的感覺走開。我主要的擔心是boost :: offset_ptr的設計,以及它如何處理NULL值 - 簡而言之,boost :: interprocess可以診斷NULL指針錯誤真的很痛苦。問題是共享內存段被映射到進程地址空間中間的某個地方,這意味着「NULL」offset_ptr在取消引用時將指向有效的內存位置,因此您的應用程序將不會 segfault 。這意味着,當你的應用程序最終崩潰時,可能在錯誤發生後很長時間,使調試變得非常棘手。

但它變得更糟。 boost ::: interprocess內部使用的互斥和條件存儲在段的開頭。因此,如果您不小心寫入some_null_offset_ptr-> some_member,您將開始覆蓋boost :: interprocess段的內部機制,並且會變得非常奇怪且難以理解的行爲。編寫協調多個進程並處理可能的競爭條件的代碼本身可能很艱難,所以它非常令人生氣。

我最終編寫了我自己的最小共享內存庫,並使用POSIX mprotect系統調用使我的共享內存段的第一頁不可讀且不可寫,這使得立即出現NULL錯誤(您浪費了一頁內存,但是這樣做除非你在嵌入式系統上,否則一個小犧牲是值得的)。您可以嘗試使用boost :: interprocess,但仍然手動調用mprotect,但這樣做不起作用,因爲boost會期望它可以寫入在段開始時存儲的內部信息。

最後,offset_ptr的假設你正在將共享內存段中的指針存儲到同一共享內存段中的其他點。如果你知道你將擁有多個共享內存段(我知道這是因爲對我來說,因爲我有一個可寫段和一個只讀段),它們將指針彼此存儲,offset_ptr的方式和你必須做一堆手動轉換。在我的共享內存庫中,我製作了一個模板SegmentPtr<i>類,其中SegmentPtr<0>將指向一個段的指針,SegmentPtr<1>將指向另一個段的指針等,以便它們不會混淆(只有知道該數字時纔可以這樣做在編譯時段)。

您需要權衡自己實現所有事情的成本,而不是額外的調試時間,您將花費追蹤NULL錯誤並潛在地混合指向不同段的指針(後者對您而言不一定是問題)。對我來說,實現自己的東西是值得的,但我並沒有大量使用boost :: interprocess提供的數據結構,所以顯然值得。如果圖書館未來可以成爲開源軟件(不適合我),我會用鏈接更新,但現在不要屏住呼吸; p

對於你的同事,雖然:不會遇到boost :: interprocess本身的任何不穩定或錯誤。我只是覺得它的設計讓你很難在自己的代碼中發現錯誤。

5

我們一直在使用boost ::進程間共享內存和interprocess.synchronization_mechanisms.message_queue約6個月了,發現該代碼是可靠的,穩定的,相當容易使用。

我們一直在我們的數據相當簡單的固定大小結構的(雖然12個地區共計大小爲2 + GB),我們使用了boost ::進程間示例代碼是和幾乎沒有問題。

我們確實發現了兩個項目要留意使用與Windows的boost ::進程間時。

  1. 評論Boost Shared Memory & Windows。如果您使用默認#include <boost/interprocess/shared_memory_object.hpp>對象,那麼你只能先重新啓動的Windows增加了內存映射區域的大小。這是因爲boost如何使用文件後備存儲。
  2. 的message_queue類使用默認shared_memory_object。所以如果消息大小需要增加,請重新啓動Windows時間。

我不想說約瑟夫加文的帖子關於他與boost :: interprocess的問題是無效的。我認爲我們的經驗差異與使用圖書館的不同方面有關。我同意他的看法,在boost :: interprocess中似乎沒有任何穩定性問題。

+4

而不是重新啓動的Windows您是不是要重新啓動應用程序?我沒有看到有關在鏈接上重新引導Windows的任何信息,或者瞭解如何使用文件作爲支持存儲可以創建必要的O_o – 2010-07-08 18:00:11

相關問題