2014-02-23 49 views
0

如果對某個庫中的代碼進行共享訪問,多個線程之間的代碼受全局互斥體保護,並且第一次獲取互斥體時,我們需要調用pthread_mutex_init,但如果多個線程嘗試調用庫函數的時間相同我們需要確保pthread_mutex_init只被一個線程調用一次。自動調用pthread_mutex_init

我們該如何做到這一點?庫構造器/析構器是一個解決方案,但庫必須支持所有的編譯器/平臺。我們可以使用計數器並使用atomic inc/dec,但對每個鎖定/解鎖操作的原子++ /操作都很昂貴。我正在尋找其他方式。所有意見將不勝感激。

回答

3

你有兩個不錯的選擇:

  1. 靜態初始化使用PTHREAD_MUTEX_INITIALIZER互斥。

  2. 使用pthread_once和靜態初始化pthread_once_t確保互斥量初始化一次。

+0

謝謝。我會嘗試這些選項。 – Pointer

+0

pthread_once可能會使用原子比較再加一個鎖定/解鎖。靜態初始化是更好的選擇。 – Pointer

+0

@Pointer當然。創建和使用靜態初始化結構是非常愚蠢的,其目的僅僅是避免靜態初始化另一個可比較的結構。 –