2016-01-21 38 views
3

我們是否在pthread_once()中使用了任何鎖定機制?在線程安全單例類中使用pthread_once()而不是使用pthread_mutex_lock()和pthread_mutex_unlock()的成本是多少?pthread_once()如何在內部實現?

+0

聽起來像它可以用簡單的原子讀/寫來完成。另外,如果我正確閱讀,它似乎並不鎖定。 –

+0

如果你不打算問一個特定的平臺,答案是,「無論你的pthreads庫的設計者認爲哪種平臺最好。 –

回答

3

該規範沒有定義pthread_oncepthread_mutex_lock必須如何實現,但只有它們必須如何行爲,所以不同的平臺將有不同的實現。

通常可以使pthread_once比互斥體簡單(因爲它只需要一個原子測試和設置操作,並且沒有阻塞),但是我也懷疑pthread_mutex_lock可能會獲得更多的優化,因爲它很多應用更廣泛。

如果你關心性能,你將不得不編寫一個基準測試並在你定位的平臺上運行它,然後選擇一個更快的測試。

1

您可以直接讀取的 pthread_once

glibc的執行你是幸運的,因爲最近的glibc團隊統一在整個支持體系的所有不同的實現。他們能夠用現代C代碼取代純裝配,這些C代碼也可以使用C11原子支持。