如果每個線程專用於一個文件,那麼讓每個線程爲正在處理的一個文件創建自己的MMF是有意義的。僅由單個線程使用的資源更易於在線程內分配和銷燬。但是,如果所有線程都從同一個文件讀取,那麼您不希望創建多個MMF,因爲所有將要執行的操作都會乘以消耗的內存量並創建一致性問題(多個視圖相同文件的一部分)。
對於在同一文件上運行的多個線程,您應該創建一次MMF並與多個線程共享MMF指針。
在多線程情況下按需分配會變得非常複雜,通常歸結爲需要鎖定對受保護資源的每次訪問。如果需要鎖定,則可以快速打敗運行多個獨立線程的任何性能優勢,前提是它們都必須排隊並等待訪問共享資源。
如果您可以在構建/啓動線程之前分配共享資源,那麼您通常不需要鎖定訪問資源,因爲資源總是在線程需要它時出現。
所以,我會考慮在線程啓動之前分配MMF,並在沒有鎖的情況下在所有線程之間共享MMF指針。
這也假定該文件是嚴格只讀的 - 多個線程永遠不會寫回文件或MMF。多線程可以共享一個指向公共內存區域/ MMF的指針,以進行只讀訪問,而不存在任何線程併發問題。
與傳統緩衝文件訪問相比,要小心您對MMF性能的假設。如果您的整個文件數據適合可用的RAM,那麼MMF對於隨機訪問模式的表現可能比緩衝文件I/O更高。如果文件數據比可用RAM大得多,那麼與使用MMF相比,緩衝文件I/O對於隨機訪問可以更高性能。爲什麼?因爲MMF對內存的使用很貪心。 MMF只能以4k頁大小的塊加載數據。緩衝文件I/O可以更精確地根據您的實際數據大小需求和模式進行調整。如果您的應用程序從文件中的100個不同的廣泛分隔的位置加載512字節的數據,則即使您只需要512 * 100 = 50k的數據,MMF也必須加載4k * 100 = 400k字節的數據。在這種數據訪問模式/用例中,MMF比傳統文件I/O需要多10倍的數據傳輸和內存消耗。
MMF的主要吸引力往往是開發者的便利,而不是原始的表現。從MMF支持的指針讀取對於開發人員來說通常比編寫和調整面向塊的文件I/O子系統更方便。只要您承認這一事實,使用這種技術就沒有問題,因爲它對開發人員來說簡單方便。
感謝您的徹底解答!我純粹處理閱讀文件,這不是一個問題,我被要求看看MMF在我的特定實例中的影響,所以我會嘗試並儘可能多地實現它,以便理解和好奇。道歉,如果我誤解,你說我最好通過一個指針,MSDN文章使用「OpenExisting」在創建時給出的名稱 - 有沒有辦法測試是否存在該名稱的MMF?我不知道我將使用哪些文件,直到我已經進入線程爲止,因爲它現在寫入的時間太晚了。 – 2013-03-06 17:09:30
對不起,指針參考 - 舊的Win32本地代碼習慣很難實現。 ;> – dthorpe 2013-03-06 21:00:13
我的建議是,如果所有線程都將使用同一個文件並且只讀取數據,那麼您可能在所有線程中只使用一個MMF實例。例如,在線程啓動之前調用MMF.CreateFromFile一次,並將該MMF對象實例與所有線程共享 - 例如,將MMF對象填充到線程可以到達的靜態變量中。如果您不打算使用MMF的多個視圖,那麼您可能也可以在所有線程中共享一個視圖。 – dthorpe 2013-03-06 21:04:06