Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多线程应用程序中使用OpenSSL 我已经在Obuntu上使用OpenSSL在C++上编写了一个SOAP客户端应用程序,用于HTTP传输和线程线程。我有很多线程——一个中央数据采集线程,它定期让工作线程通过共享互斥保护队列发出SOAP请求_C++_Multithreading_Soap_Openssl_Pthreads - Fatal编程技术网

在多线程应用程序中使用OpenSSL 我已经在Obuntu上使用OpenSSL在C++上编写了一个SOAP客户端应用程序,用于HTTP传输和线程线程。我有很多线程——一个中央数据采集线程,它定期让工作线程通过共享互斥保护队列发出SOAP请求

在多线程应用程序中使用OpenSSL 我已经在Obuntu上使用OpenSSL在C++上编写了一个SOAP客户端应用程序,用于HTTP传输和线程线程。我有很多线程——一个中央数据采集线程,它定期让工作线程通过共享互斥保护队列发出SOAP请求,c++,multithreading,soap,openssl,pthreads,C++,Multithreading,Soap,Openssl,Pthreads,阅读OpenSSL常见问题解答中的OpenSSL文档,其中描述了使用OpenSSL时确保线程安全所需的机制。我实现了这个,所有的工作都很好 我提出这个问题的原因实际上是概念上的困难。我正在考虑实现与我的应用程序相同的功能,但不是使用线程,而是创建两个独立的应用程序:一个用于工作线程(其中多个副本将运行),另一个用于主数据采集线程。然后,我将使用TCP套接字在这两个队列之间进行通信,而不是使用受互斥保护的队列。这可能是个坏主意,但这并不重要-让我困惑的是在第二种方法中,我是否必须实现确保OpenS

阅读OpenSSL常见问题解答中的OpenSSL文档,其中描述了使用OpenSSL时确保线程安全所需的机制。我实现了这个,所有的工作都很好

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


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

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

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


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

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

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


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

实际上,我将坚持使用我的多线程应用程序。我只是很难看出5个单独连接的线程之间的区别,每个线程都需要定制的OpenSSL锁代码,但是5个单独连接的进程都不需要。我发现这个问题非常有趣。在我所知道的使用多线程的所有情况下,只有当线程争夺资源时才需要锁定。所以这种情况是个例外。由于它们是独立的连接,OpenSSL应该能够处理它们,这就是问题所在。如果你真的在比较两种情况的性能,请更新。非常感谢-这正是我想要的解释!!