2012-02-13 84 views
5

目前,我有2個使用message_queue和shared_memory格式boost進行通信的進程。一切都如工作。是boost :: interprocess線程安全嗎?

現在我需要使這個過程中的一個多線程(再次感謝提升),並且我想知道是否需要在線程之間使用保護機制(例如互斥體),或者boost :: interprocess庫已經提供了一個保護機制?

我沒有在boost文檔上找到任何信息。順便說一句,我使用提升1.40。

在此先感謝。

+0

您是否閱讀過http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html? – 2012-02-13 20:18:15

回答

2

自boost ::進程間(共享存儲器等)的共享資源要求您提供必要的同步。原因是你可能不需要同步,而且它通常在操作性能方面比較昂貴。

舉例說,你有一個進程向共享內存寫入32位整型格式的當前統計信息,還有一些讀取這些值的進程。由於這些值是整數(因此在您的平臺上,讀取和寫入是原子的),並且您有一個寫入它們的過程以及一些讀取它們的過程,所以此設計不需要同步。

但是在一些例子中,你需要同步,就像上面的例子有多個編寫器,或者如果你使用的是字符串數據而不是整數。有內部升壓的各種同步機制(以及非升壓的,但因爲你已經在使用升壓),描述如下:

[升壓信息的穩定版本:1.48 http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[升壓信息爲版本的使用:1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

具有共享存儲器它是一種常見的做法是放置在共享存儲器段,在那裏它可以是匿名的基同步機構(意味着OS內核不提供訪問它的名字)。通過這種方式,所有進程都知道如何鎖定共享內存段,並且可以將鎖與段關聯(例如,如果您有多個段)

請記住,互斥量需要執行相同的線程解鎖它,鎖定它。如果您需要鎖定和解鎖來自不同執行線程的同步對象,則需要一個信號量。

請確定如果您選擇使用它是進程間互斥鎖的互斥鎖(http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html)而不是boost線程庫中的互斥體,該線程庫用於具有多個線程的單個進程。

+0

+1「因爲這些值是整數(因此在您的平臺上,讀取和寫入是原子的),並且您有一個寫入它們的過程和幾個讀取它們的過程,所以此設計不需要同步。 – FaceBro 2017-08-22 02:04:59