我正在进入OpenSSL库的第一步,感到有点迷茫。我的机器是一个多线程(Xeon系列,可以分享更多,如果有人需要信息)与Linux操作系统。
应用程序构建是SSL代理,因此我需要尽可能快地处理多个TCP流,这意味着我希望尽可能地以无锁的方式运行lib。
主要在本节中查看了crypto/crypto.h内部的一些内容之后:
# ifndef OPENSSL_NO_LOCKING
# ifndef CRYPTO_w_lock
# define CRYPTO_w_lock(type) \
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
# define CRYPTO_w_unlock(type) \
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
# define CRYPTO_r_lock(type) \
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__)
# define CRYPTO_r_unlock(type) \
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
# define CRYPTO_add(addr,amount,type) \
CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
# endif我试图挖掘代码/API,结果有点迷路了。我的问题是:
发布于 2016-12-30 04:07:58
OpenSSL库对多核/线程应用程序有什么支持?
多线程应用程序是受支持的,但请注意,它并不“只是工作”--特别是,您必须使用安装一些特殊的回调,这样OpenSSL才能进行必要的序列化/锁定,否则您的程序将受到竞争条件的影响,不能正常工作。(即使安装了回调,您也希望将对任何特定OpenSSL套接字/连接的访问仅限于单个线程,即在没有同步的情况下,在同一连接的OpenSSL句柄上不同时执行两个线程的操作)
库的哪些部分只能有一个实例(单例)?
那么,锁定回调(必要的话)只有一个实例,因为所有线程都使用它们来序列化关键部分。
此外,SSL库设置函数(SSL_load_error_strings()、SSL_library_init()等)只应在应用程序执行开始时(即在生成任何线程之前)调用,并且只有在任何派生线程被联接()d和丢弃之后才调用SSL库解锁函数(如果有的话);这样,您将避免出现任何可能的争用条件,即线程试图使用尚未完全构建或已经部分或完全销毁的OpenSSL资源。
我想尽可能地以无锁的方式运行库。
好吧,你可能运气不好-- OpenSSL不是为无锁运行而设计的;它的会话使用共享的、非只读的数据结构,对这些数据结构的访问必须是同步的,否则会出现错误。我认为最好的方法是使用锁回调作为推荐,并信任OpenSSL实现者保持锁的时间不会超过严格要求。如果这还不够,那么您可能不得不开始寻找不同的SSL库实现,或者考虑采用多线程而不是多线程。
https://stackoverflow.com/questions/41388193
复制相似问题