我正在修改一個完全可重入的庫來添加Windows支持。問題是初始化函數。初始化函數被包裝在MUTEX_LOCK(&ssl_lock);
和MUTEX_UNLOCK(&ssl_lock);
中,以便確保所有內容僅被初始化一次。你如何以可重入的方式初始化CriteriaSection?
問題是我不能在InitializeCriticalSection
之前撥打EnterCriticalSection
,InitializeCriticalSection
不可重入。我該如何解決這個問題?
我正在修改一個完全可重入的庫來添加Windows支持。問題是初始化函數。初始化函數被包裝在MUTEX_LOCK(&ssl_lock);
和MUTEX_UNLOCK(&ssl_lock);
中,以便確保所有內容僅被初始化一次。你如何以可重入的方式初始化CriteriaSection?
問題是我不能在InitializeCriticalSection
之前撥打EnterCriticalSection
,InitializeCriticalSection
不可重入。我該如何解決這個問題?
根據您需要支持什麼版本的SOF Windows中,您可以使用 「初始化一次」 的API:
如果您需要支持的WinXP /運Server 2003或更早版本,您可能需要依賴內核可確保只創建一次的Mutex對象。在打開/創建互斥鎖時,您需要實現一些邏輯,以確保所有執行線程都以有效句柄結束(即,嘗試打開的循環,然後嘗試創建,直至打開或創建成功)。
就像旁邊一樣,我按照你所說的做了,但是採用了一種完全不同的方式:我使用了'InterlockedExchange'來檢查init變量,並根據這個結果值然後我調用'InitializeCriticalSection' – chacham15
@ chacham15:它可以保證只有一個調用InitializeCriticalSection()',但是如果可能有多個線程在'InitializeCriticalSection ()'被調用 - 只有一個線程會決定調用'InitializeCriticalSection()',但其他線程將繼續前進,並可能在臨界區對象被初始化之前使用它。你需要有一種方法來阻止這些其他線程,直到初始化調用完成(對原子變量的一個忙碌的等待循環可能會起作用)。 –
正在寫文檔說:「這是一個有效的解決方案不確定調用'mylib_init'不止一次? –
@TravisGockel問題在於init函數由庫內部調用,因此調用者不需要初始化。 – chacham15
GCC有一個很酷的東西叫做threadsafe-statics,但它看起來不像MSVC的等價物。 –