c++ - 在多线程应用程序中使用 OpenSSL

标签 c++ multithreading soap openssl pthreads

我一直在 Ubuntu 上用 C++ 编写 SOAP 客户端应用程序,使用 OpenSSL 进行 HTTPS 传输,并使用 pthreads 进行线程处理。我有许多线程 - 一个中央数据采集线程定期获取工作线程以通过共享互斥保护队列发出 SOAP 请求。

阅读 OpenSSL 文档我发现 Is OpenSSL thread-safe? OpenSSL 常见问题解答中描述了使用 OpenSSL 时确保线程安全所需的机制。我实现了这个并且一切正常。

我的问题的原因确实是概念上的困难。我正在考虑实现我的应用程序已经具有的相同功能,但我不会使用线程,而是创建 2 个单独的应用程序:一个用于工作线程(其中将运行多个拷贝),另一个用于工作线程用于主数据采集线程。然后,我将使用 TCP 套接字在两者之间进行通信,而不是使用互斥保护队列。这可能是一个坏主意,但这并不重要 - 让我困惑的是我是否必须在第二种方法中实现确保 OpenSSL 线程安全所需的相同功能?

我的猜测是我不必这样做,它们可以被视为独立(确实肯定如此,因为很多应用程序都使用 OpenSSL),但原因是什么? 使用共享库代码的多个应用程序与共享相同代码的多个线程之间有什么不同?我已经为几个人成功编写了多线程应用程序多年来,我一直无法回答这个问题,这让我很担心。

最佳答案

不同之处在于,当多个线程共享相同的库代码时,它们也共享相同的全局数据结构;当多个进程共享该库代码时,它们不会共享该库代码。

例如,OpenSSL 中的许多加密算法如果有大量可用的预先计算表,则速度会更快。该表在调用相同 OpenSSL 函数的多个线程之间共享,但必须使用锁定来确保只有一个线程在第一次使用时尝试初始化该表。

再举一个例子,许多 OpenSSL 函数在内部访问随机数生成器,但其状态是一个全局数据结构,必须跨线程同步访问它。

关于c++ - 在多线程应用程序中使用 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251859/

相关文章:

Java(Web 服务 - SOAP)- 如何在客户端添加 SOAP 处理程序并正确启用 MTOM?

java - 要求更新的技术

c++ - 修改字符串数组中的字符串

ios - RxSwift — 不卡住 UI 的后台任务

ios - 在 iOS 后台线程中使用自动释放变量

Java - 并行读取二进制文件

delphi - 缺少 SOAP 顶级节点

c++ - 使用 Qt Creator 构建 Stanford CS106B 项目的问题

c++ - 在 iPhone xcode 应用程序中,是否可以声明具有全局范围的指针?

c++ - Qt OpenGL 段错误