在多线程应用程序中使用OpenSSL

时间:2012-06-28 19:49:08

标签: c++ multithreading soap openssl pthreads

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

阅读OpenSSL的文档我在OpenSSL FAQ中找到了Is OpenSSL thread-safe?,其中描述了在使用OpenSSL时确保线程安全所需的机制。我实现了这一切,一切正常。

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

我的猜测是我不必这样做,他们可以被视为独立(确实必须是因为许多应用程序使用OpenSSL)但是它的原因是什么? 多个应用程序使用共享库代码和多个线程共享相同代码之间有什么不同?我一直在为一对成功编写多线程应用程序现在多年来,我无法想出这个问题的答案。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

我认为主要的区别在于,在共享相同代码的多个线程中,如果需要可以进行同步,而在使用共享库代码的多个应用程序这是除了文件锁定等机制之外,不容易实现。此外,还会有相当大的性能提升。

考虑例如应用程序包含一个只写入屏幕的显示(msg)方法,以及一个调用display(msg)的main()。如果有五个线程调用此方法,我们将能够同步调用,以便输出不会出现乱码。但是,如果在五个不同的应用程序中实现了显示(msg)方法,并且使用TCP套接字从主应用程序发送消息,则输出将出现乱码。

因此,在您的情况下,它取决于工作线程尝试使用OpenSSL做什么。根据我的理解,他们正在进行单独的SSL连接,因此在应用程序中不需要线程安全。但是,当一个简单的函数调用转换为两个应用程序之间的TCP通信时,会产生性能开销,我认为所产生的开销远远超过了使用单线程应用程序的好处。

相关问题