我正在寫一些代碼來執行顯式鏈接到一個DLL。此代碼作爲隱式鏈接到.lib文件的替代方法提供給我的用戶。目前,我計劃的代碼如下所示:我是否需要爲此代碼添加同步?
void DisableModule(int Module)
{
typedef void (*DisableModuleProc)(int);
static DisableModuleProc proc = NULL;
if (proc == NULL)
proc = (DisableModuleProc)GetProcAddress(hModule, "DisableModule");
proc(Module);
}
有很多這種形式的功能,我已經切除了錯誤檢查這個問題的目的。
我的問題與線程安全有關。這個函數可能會被多個線程同時調用。顯然在靜態變量_DisableModule
上有一場比賽。我的看法是,因爲_DisableModule
將根據機器字邊界(32或64位邊界取決於目標)對齊,所以不會發生撕裂,所以比賽是良性的。 GetProcAddress
可能會被調用超過必要次數,但我認爲這不會影響程序的正確性。
我的分析是否正確?
被調用函數(_DisableModule)本身是線程安全嗎?此外,以下劃線和大寫字母開頭的標識符被保留。 – zvrba 2012-03-21 12:49:15
@zvrba是的,導入的函數是線程安全的。非常感謝有關保留標識符的建議。我一點都不流利。 – 2012-03-21 12:51:37
取決於處理器的類型,但是在x86或x64上,這將工作得很好。不太確定ARM,它有一個弱的內存模型。使用線程時始終明智地調用'比安全更安全'。 – 2012-03-21 12:53:00