1

ActiveMQ-cpp (ライブラリ バージョン 3.8.2) と相互接続されたスレッド化されたデータ プーリング システムを開発しています。システムは定期的にプールできるデバイスのグループを管理し、ポーリング結果はブローカーのキューに送信されます。応答キューは制御メッセージによっていつでも変更できるため、プロデューサーと宛先は常に変更されます。1 つのサブスクライバだけがすべての制御コマンドを受信し、複数のスレッドが独自のセッションからプロデューサとメッセージを作成します。すべてのメッセージは TextMessages です。

すべての activemq-cpp 要素は RAII 要素にラップされていますが、集中的に使用した後のある時点で、接続はメッセージを受信しますが、応答を送信しようとすると、ライブラリは「スレッド ローカル ストレージの制限に達しました」という例外をスローします。その後、さらにいくつかのメッセージを受信します (テキストが壊れている場合があります) が、新しいメッセージを送信しようとすると、スレッド ストレージ例外に再び陥り、受信と送信が完全に停止します。

この種の問題を見つけた人はいますか?どんな助けでも大歓迎です。

更新: 新しい 3.8.3 バージョンをコンパイルして使用しましたが、まだエラーを再現できます。テストは RHEL 5.7 と Fedora 20 で行われ、どちらも 64 ビット アーキテクチャです。

4

1 に答える 1

4

数日間のデバッグとラッパーでの refcounting の後、原因は削除されていない構造体への間違ったポインタであることがわかりました。これは特に、Valgrind の memcheck から欠落しているポインターを「間接的な損失」として隠しました。

結局のところ、当面の問題は、削除されていない cms::Session ポインターのコレクションでした (他の cms オブジェクトでも発生する可能性があります)。

activemq-cpp ライブラリが Session セクションで指摘しているように、cms::Session は単一のスレッド要素です。ただし、それを作成した接続がそのいくつかのアクションを制御し、特に生成されたセッションへの参照を保持し、これらすべてが接続スレッドスタックに保存されることも述べています。したがって、大量のセッション作成により、接続容量がいっぱいになると、「スレッド ローカル ストレージの制限に達しました」がトリガーされます。

于 2014-08-07T16:18:17.203 に答える