Kar*_*ick 1 c curl libcurl gnutls
libcurl 线程安全的要求之一是底层 SSL 库应该是线程安全的。
根据 GnuTLS 的文档,它的设计是线程安全的。
GnuTLS 库在设计上是线程安全的,这意味着只要单个线程访问单个对象,该库的对象(例如 TLS 会话)就可以安全地跨线程划分。这足以支持每个线程处理多个会话的服务器。对对象(例如持有结构的凭证)的只读访问也是线程安全的。
然而,有一些用例需要注意。
gnutls_session_t 对象也可以由两个线程共享,一个发送,另一个接收。但是,必须注意以下用例:
TLS 1.2 或更早版本中的重新握手过程必须仅在单个线程中处理,并且其他线程不得执行任何操作。
在此操作模式下不能安全地使用标志 GNUTLS_AUTO_REAUTH。
当线程接收或写入时,不得执行任何其他可能发送或接收数据的操作,例如密钥更新(参见 gnutls_session_key_update)。
会话的终止应该由处于活动状态的单个线程来处理,或者由发送者线程使用 gnutls_bye 和 GNUTLS_SHUT_WR 以及接收线程等待返回值零(或在某些不响应的服务器上超时)来处理。
在并行操作期间不应依赖函数 gnutls_transport_set_errno 和 gnutls_record_get_direction。
libcurl 是否能够处理上述用例?
是的,它确实。
libcurl 不使用来自多个线程的 gnutls_session_t 对象,因此上述预防措施不适用(它也不执行任何其他非线程安全的操作)。只要您遵循libcurl 的线程安全指南,线程化的 libcurl 与 GnuTLS(或其他 TLS 后端)一起使用应该没问题。