參考鏈接
Synchronization mechanisms overview
- Named And Anonymous Synchronization Mechanisms
- Types Of Synchronization Mechanisms
- 如前所述,如果不能有效地同步對內存的訪問,那么通過內存映射文件或共享內存對象在進程之間共享內存的能力就不是很有用。這和線程同步機制的問題是一樣的,線程之間共享堆內存和全局變量,但對這些資源的訪問通常需要通過mutex和條件變量進行同步。Boost.Threads實現了同一進程內線程之間的這些同步工具。Boost.Interprocess實現了類似的機制來同步不同進程的線程。
Named And Anonymous Synchronization Mechanisms
- Boost.Interprocess提供了兩種類型的同步對象。
- 命名的實用程序。當兩個進程想要創建這種類型的對象時,兩個進程必須使用相同的名稱創建或打開一個對象。這類似于創建或打開文件:一個進程使用名稱為 filename 的 fstream 創建一個文件,另一個進程使用具有相同 filename 參數的另一個 fstream 打開該文件。每個進程都使用不同的對象來訪問資源,但兩個進程使用的是同一個底層資源。適用于不同進程之間對于相同文件的操作
- 匿名實用程序。由于這些實用程序沒有名字,兩個進程必須通過共享內存或內存映射文件來共享同一個對象。這與傳統的線程同步對象類似。兩個進程共享同一個對象 與線程同步不同的是,在線程同步中,同一進程的線程之間共享全局變量和堆內存,而來自不同進程的兩個線程之間只能通過映射同一可映射資源的映射區域(例如共享內存或內存映射文件)共享對象。適用于同一進程不同線程之間對于相同文件的操作
- 每種類型都有自己的優缺點。
- 對于簡單的同步任務來說,命名的實用程序更容易處理,因為兩個進程都不需要創建一個共享內存區域并在那里構建同步機制。
- 當使用內存映射對象獲得同步實用程序的自動持久化時,匿名實用程序可以被序列化到磁盤上。人們可以在內存映射的文件中構造一個同步實用程序,重新啟動系統,再次映射文件,然后再次使用同步實用程序,而不會有任何問題。這一點在命名同步實用程序中是無法實現的。
- 命名實用程序和匿名實用程序的主要接口區別在于構造函數。通常匿名實用程序只有一個構造函數,而命名實用程序有多個構造函數,其第一個參數是請求創建、打開或打開或創建底層資源的特殊類型。
using namespace boost::interprocess;//Create the synchronization utility. If it previously
//exists, throws an error
NamedUtility(create_only, ...)//Open the synchronization utility. If it does not previously
//exist, it's created.
NamedUtility(open_or_create, ...)//Open the synchronization utility. If it does not previously
//exist, throws an error.
NamedUtility(open_only, ...)
- 另一方面,只能創建匿名同步實用程序,進程必須使用其他機制同步,誰創建實用程序。
using namespace boost::interprocess;//Create the synchronization utility.
AnonymousUtility(...)
同步機制的類型
- 除了命名/匿名的特性之外,Boost.Interprocess還提供了以下同步實用程序。
- Mutexes(命名和匿名)
- 條件變量(命名和匿名)
- Semaphores (named and anonymous)
- 可升級的mutexes
- 文件鎖