クライアントが抱えている問題を解決するのを支援します。私はシステム管理者/DBAの人なので、彼らを助けるのに苦労しています。彼らはそれがカーネル/環境のバグだと言っています、私はそれが彼らのコードにあると主張するか、OSのベンダーサポートを求める前にそれを証明または反証しようとしています。
RedHatおよびOracleEnterpriseLinux 5.7(および5.8)で発生し、アプリケーションはC++で記述されています
彼らが経験している問題は、メインスレッドが別のスレッドを開始して、実行時間が長くなる可能性のあるTCP connect()[サーバーに接続しているクライアント]を実行することです。「長時間実行」アスペクトに時間がかかりすぎる場合、スレッドをキャンセルして別のスレッドを開始します。
これは、サーバープログラムの状態がわからないために行われます。
- サーバープログラムが起動して実行中->接続がすぐに受け入れられました
- サーバープログラムが実行されていない、マシンとネットワークがOK->接続がすぐに失敗し、エラー「接続が拒否されました」
- マシンまたはネットワークがクラッシュまたはダウンしました->接続が失敗するのに長い時間がかかりますエラー「ホストへのルートがありません」
問題は、ミューテックスがロックされているスレッドをキャンセルすると(ミューテックスのロックを解除するようにクリーンアップハンドラーが設定されている場合)、ミューテックスのロックが解除されない場合があることです。
そのため、ミューテックスをロックしようとするとメインスレッドがハングしたままになります。
詳細な環境情報:
- glibc-2.5-65
- glibc-2.5-65
- libcap-1.10-26
- kernel-debug-2.6.18-274.el5
- glibc-ヘッダー-2.5-65
- glibc-common-2.5-65
- libcap-1.10-26
- kernel-doc-2.6.18-274.el5
- カーネル-2.6.18-274.el5
- kernel-headers-2.6.18-274.el5
- glibc-devel-2.5-65
コードは次のコマンドで作成されました:c ++ -g3 tst2.C -lpthread -o tst2
アドバイスやガイダンスは大歓迎です