2011-02-28 135 views
10

我對跨平臺IPC的默認選擇是提升,但當我問及這個問題時,我看到它在兩個不同的論壇上受到批評。也許這只是一個巧合,那麼對於提升IPC以及總體選擇跨平臺C++ IPC庫有什麼想法?Boost IPC有什麼好處?

對於Windows開發,我們使用VC++ 2008作爲參考。

編輯:這裏是我見過的做註釋的例子(不能沒事找到它們):

升壓,這是廢話。至少在 窗口。互斥體不使用WinAPI,而是創建它自己的 基於文件的實現(WinAPI = 內核對象)。如果您的程序 崩潰,文件將不會被刪除。 下次啓動程序時 無法創建互斥鎖,因爲 是現有文件。

+1

缺少您需要的功能?如果答案是沒有,我不明白爲什麼你需要擔心其他人可能不會分享你的需求的「批評」... – Nim

+1

他們究竟批評什麼?你能提供鏈接嗎?就像這樣,問題太模糊 –

+2

這不是特徵,而是被批評的實現。我不明白這個問題是如何模糊的......如果Boost的實現存在問題,那麼分享它們,如果有更好的庫,請列出它們。 –

回答

7

從我有限的Boost.Interprocess經驗中,我沒有任何重大問題,但我無法真正評論性能。雖然確實使用在程序文件夾外部創建的文件來完成它們的工作,但它們都應該是內存映射的,這可以消除大多數性能問題。無論如何,當你使用IPC時,你應該總是期望額外的性能開銷。

至於您突出強調的批評,可以刪除一個已命名的互斥體或任何其他命名資源,這些資源已被前一個進程留下(請參閱靜態的remove(const char*)函數)。公平地說,取決於您的應用程序,正確使用這可能會非常棘手,這在使用Windows API時不是您必須處理的。另一方面,Windows API不可移植。我的猜測是,他們使用文件(即使有更好的替代方案),以保持庫的界面和行爲在不同平臺之間保持一致。

無論如何,命名互斥體只是圖書館提供的一小部分。其中一個更有用的功能是它提供了own memory managers for the shared memory region其中包括STL allocators。我個人覺得使用它提供的高級構造與原始內存一起工作會更愉快。


更新:我沒多一些挖Boost文檔中,我在各種有趣的TID位傳來:

This page提供有關執行情況的一些詳細信息和庫的性能,但不包含實施原理。

This link明確指出他們的Windows互斥體實現可以使用一些工作(版本1.46)。如果您在boost\interprocess\sync文件夾中進一步挖掘,您會注意到另外兩個名爲posixemulation的文件夾。這兩個都包含同步原語的實現細節。爲interprocess_mutex::lock POSIX的實現是你期望什麼,但仿真的實現是非常基本的:

// Taken from Boost 1.40. 
inline void interprocess_mutex::lock(void) 
{ 
    do{ 
     boost::uint32_t prev_s = detail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0); 

     if (m_s == 1 && prev_s == 0){ 
      break; 
     } 
     // relinquish current timeslice 
     detail::thread_yield(); 
    }while (true); 
} 

所以由它的外觀,它們的目的是對POSIX的支持和blobbed一切成使用內存映射的仿真層文件。如果你想知道他們爲什麼不提供專門的Windows實現,那麼我建議你詢問Boost郵件列表(我在文檔中找不到任何東西)。

+0

嗯,很多東西在不同的操作系統上有不同的工作方式,這就是爲什麼我們需要類庫的提升等等。我的印象是,Linux擁有自己更高效的機制,比如Windows,所以我期望跨平臺的庫使用每個平臺的高效機制併爲我提供一致的抽象。 –

+0

@John問題在於你會減少可移植性,同時增加庫的大小和複雜性。如果你不得不爲你想支持的每個操作系統重新編寫大部分庫,那麼你可能會做錯了。請注意,這是純粹的猜測。你總是可以試着在Boost郵件列表上詢問。 –

+1

跨平臺庫的重點在於它包含了低級別的東西,這些東西在不同的平臺上有着不同的共同抽象。事實上,這些低層次的事情是不同的,例如圖書館的整個觀點......看看跨平臺的GUI庫。 –

1

這是不是直接回答你的問題,而是一個選擇:如果您對開發環境進行選擇,那麼你可以考慮Qt和the D-bus implementation in Qt

+0

不,我不能重寫整個應用程序來使用新的框架:)。 –