2

私は、HTTPSトランスポートにOpenSSLを使用し、スレッド化にpthreadを使用して、Ubuntu上のC++でSOAPクライアントアプリケーションを作成しています。私はいくつかのスレッドを持っています-1つの中央データ取得スレッドは定期的にワーカースレッドを取得して、共有ミューテックスで保護されたキューを介してSOAPリクエストを作成します。

私が見つけたOpenSSLのドキュメントを読むOpenSSLはスレッドセーフですか?OpenSSLを使用するときにスレッドセーフを確保するために必要なメカニズムについて説明しているOpenSSLFAQにあります。私はこれを実装し、すべて正常に動作します。

私の質問の理由は本当に概念的な難しさです。私は自分のアプリケーションがすでに持っているのと同じ機能を実装することを考えていましたが、スレッドを使用する代わりに、2つの別々のアプリケーションを作成しました。1つはワーカースレッド(複数のコピーが実行されます)用で、もう1つはメインデータ取得スレッド用です。次に、ミューテックスで保護されたキューではなく、TCPソケットを使用して2つの間で通信します。これは悪い考えかもしれませんが、それはそれほど重要ではありません-私を混乱させるのは、この2番目のアプローチでOpenSSLスレッドセーフを確保するために必要な同じ関数を実装する必要があるかどうかです。

私の推測では、そうする必要はなく、独立したものとして扱うことができます(確かに、多くのアプリケーションがOpenSSLを使用しているのと同じくらいでなければなりません)が、その理由は何ですか?共有ライブラリコードを使用する複数のアプリケーションと、同じコードを共有する複数のスレッドの違いは何ですか? 私はここ数年マルチスレッドアプリケーションをうまく作成してきましたが、この質問に対する答えを思い付くことができないのではないかと心配しています。

4

2 に答える 2

2

違いは、複数のスレッドが同じライブラリコードを共有する場合、それらも同じグローバルデータ構造を共有することです。複数のプロセスがそのライブラリコードを共有する場合、共有しません。

たとえば、OpenSSLの暗号化アルゴリズムの多くは、事前に計算された大きなテーブルが利用できる場合、より高速になります。このテーブルは、同じOpenSSL関数を呼び出す複数のスレッド間で共有されますが、最初の使用時に1つのスレッドのみがテーブルの初期化を試みるようにするには、ロックを使用する必要があります。

別の例として、多くのOpenSSL関数は内部で乱数ジェネレーターにアクセスしますが、この状態はグローバルデータ構造であり、スレッド間でアクセスを同期する必要があります。

于 2012-07-02T07:38:19.777 に答える
0

主な違いは、同じコードを共有する複数のスレッドでは、必要に応じて同期を実行できるのに対し、共有ライブラリコードを使用する複数のアプリケーションでは、ファイルロックなどのメカニズム以外では簡単に同期できないことです。また、パフォーマンスが大幅に向上します。

たとえば、画面に書き込むだけのdisplay(msg)メソッドと、display(msg)を呼び出すmain()を含むアプリケーションについて考えてみます。このメソッドを呼び出すスレッドが5つある場合、出力が文字化けしないように呼び出しを同期することができます。ただし、display(msg)メソッドが5つの異なるアプリケーションに実装され、メインアプリケーションからのメッセージの送信にTCPソケットが使用された場合、出力は文字化けします。

したがって、あなたの状況では、ワーカースレッドがOpenSSLで何をしようとしているかによって異なります。私の理解では、それらは別々のSSL接続を行っているため、アプリケーション内でスレッドセーフは必要ありません。ただし、単純な関数呼び出しが2つのアプリケーション間のTCP通信に変換されるため、パフォーマンスのオーバーヘッドが発生します。発生するオーバーヘッドは、シングルスレッドアプリケーションを使用する場合のメリットよりもはるかに大きいと思います。

于 2012-06-28T20:50:02.540 に答える