2012-08-28 74 views
2

我正在修改一個完全可重入的庫來添加Windows支持。問題是初始化函數。初始化函數被包裝在MUTEX_LOCK(&ssl_lock);MUTEX_UNLOCK(&ssl_lock);中,以便確保所有內容僅被初始化一次。你如何以可重入的方式初始化CriteriaSection?

問題是我不能在InitializeCriticalSection之前撥打EnterCriticalSectionInitializeCriticalSection不可重入。我該如何解決這個問題?

+0

正在寫文檔說:「這是一個有效的解決方案不確定調用'mylib_init'不止一次? –

+0

@TravisGockel問題在於init函數由庫內部調用,因此調用者不需要初始化。 – chacham15

+0

GCC有一個很酷的東西叫做threadsafe-statics,但它看起來不像MSVC的等價物。 –

回答

4

根據您需要支持什麼版本的SOF Windows中,您可以使用 「初始化一次」 的API:

如果您需要支持的WinXP /運Server 2003或更早版本,您可能需要依賴內核可確保只創建一次的Mutex對象。在打開/創建互斥鎖時,您需要實現一些邏輯,以確保所有執行線程都以有效句柄結束(即,嘗試打開的循環,然後嘗試創建,直至打開或創建成功)。

+0

就像旁邊一樣,我按照你所說的做了,但是採用了一種完全不同的方式:我使用了'InterlockedExchange'來檢查init變量,並根據這個結果值然後我調用'InitializeCriticalSection' – chacham15

+1

@ chacham15:它可以保證只有一個調用InitializeCriticalSection()',但是如果可能有多個線程在'InitializeCriticalSection ()'被調用 - 只有一個線程會決定調用'InitializeCriticalSection()',但其他線程將繼續前進,並可能在臨界區對象被初始化之前使用它。你需要有一種方法來阻止這些其他線程,直到初始化調用完成(對原子變量的一個忙碌的等待循環可能會起作用)。 –

2

您可以在您的DllMain()DLL_PROCESS_ATTACH處理程序中初始化它。

+0

沒有DLL主,它是一個靜態鏈接庫 – chacham15

相關問題