當我動態加載共享庫時(例如在Linux上使用dlopen
)時,是否必須擔心處理器之間加載庫的可見性,還是會自動圍欄/確保安全?共享庫(dlopen)和庫靜態指針的線程安全性
例如,說我有在裝載的庫此功能:
char const * get_string()
{ return "literal"; }
在使用這樣的字串文本指針主程序是多個線程之間的安全,因爲他們都保證看到它的初始值。然而,我想知道「初始值」的規則是如何真正適用於已加載的庫(因爲標準並沒有太多處理它)。
說我加載庫,然後立即調用get_string
函數。我通過非內存排序原子將指針傳遞給另一個線程(在C++ 11中用寬鬆的說法)。另一個線程可以安全地使用這個指針而不必發出任何載入柵欄或其他同步指令嗎?
我的假設這是安全的,也許是因爲新的庫會被加載到新的頁面中,另一個核心不能讓它們加載,因此不能在它們上面具有舊的可見性?
如果可能的話,我希望有某種授權參考作爲答案的一部分。或者是關於如何在默認情況下使其成爲線程安全的技術說明。或者,如果它本身不是線程安全的,那當然是一種駁斥。
@DeadMG,這仍然是C/C++相關的。我使用C字符串文字結構,因爲它具有特定的生命期限。此外,特定的語言編譯器/鏈接器肯定涉及解決這個問題,從這個角度來看,我對C或C++語言工具鏈感興趣。 – 2012-03-02 17:43:16
它比任何其他本地代碼庫中的任何其他靜態數據都沒有更多的終身保證。而語言編譯器/鏈接器沒有關於'dlopen'的說法 - 它是一種操作系統函數,它在每個本地代碼庫上都是相同的,而不考慮源語言。呵呵,C和C++是完全不同的語言,在你提出這個問題之前,你是否想要一個或另一個是非常重要的事情。 – Puppy 2012-03-02 20:16:10
'dlopen'當然不是OS功能,而是Linux上glibc的一部分。 dlopen的結果只能用於支持原始指針訪問的語言,因此主要是C和C++。 – 2012-03-04 08:16:16