我在Linux中編寫了一個C庫(比方說,libA),它利用Openssl來執行base64編解碼器,哈希等。一些其他項目例如projB)利用libA做些事情,而這些項目本身也會調用Openssl API。所以,projB調用Openssl的API的方式有兩種:Openssl線程安全回調函數註冊既有直接調用也有間接調用
- 呼叫Openssl的的API直接:projB - > Openssl的
- 呼叫Openssl的API的間接:projB - >力霸 - > Openssl的
同時,這是officially announced,Openssl不是線程安全的,除非至少有兩個回調函數註冊到Openssl中:
- 空隙ssl_locking_function(INT模式,INT N,常量字符*文件,INT線)
- 無符號長ssl_threadid_function()
LIBA暴露下面的API來projB:
- int InitA(void)
- int ActionStuff()
- 無效DestroyA()
爲了確保的OpenSSL線程安全,是有兩種解決方案:
#1。 libA在InitA中將回調函數註冊到Openssl中()
#2。 projB註冊回調函數到Openssl的初始化時,調用的API力霸面前,力霸沒有做回調註冊
有了解決方案#1,力霸本身是線程安全的,對於調用的API Openssl的。但是,projB還必須確保其線程安全性,並且它將採取類似的將回調函數註冊到Openssl的操作。
假設LIBA註冊以下回調函數
- 空隙ssl_locking_function_A(INT模式,詮釋N,常量字符*文件,INT線)
- 無符號長ssl_threadid_function_A()
和projB寄存器這些
- 無效ssl_locking_function_B(INT模式,詮釋N,爲const char *文件,INT線)
- 無符號長ssl_threadid_function_B()
據我瞭解,力霸的回調函數後projB的註冊,
- projB初始化
:最終,projB的回調函數是由力霸的陰影- projB註冊ssl_locking_function_B()和ssl_threadid_function_B()到Openssl的
- projB調用INITA()
- 力霸註冊ssl_locking_function_A()和ssl_threadid_function_A()到Openssl的
- projB調用ActionStuff()
- ...
- projB調用DestroyA()
- projB反初始化
我的問題是,哪種解決方案更好,#1或#2?有沒有更好的解決方案?
你是說'projB'意識到'libA'正在使用OpenSSL,但也想直接使用OpenSSL本身? – jxh