activemq-cpp throws & quot; Предел локального хранилища потока & quot; достиг при отправке

Я занимаюсь разработкой многопоточной системы пула данных, связанной с ActiveMQ-cpp (версия библиотеки 3.8.2). Система управляет группой устройств, которые могут периодически объединяться, результаты опроса отправляются в очередь в посреднике. Очередь ответов может быть изменена в любое время с помощью управляющего сообщения, поэтому производители и адресаты постоянно меняются. Только один подписчик получает все управляющие команды, а несколько потоков создают производителей и сообщения из своих собственных сеансов. Все сообщения являются текстовыми сообщениями.

Все элементы activemq-cpp обернуты в элементы RAII, но в какой-то момент после интенсивного использования соединение получает сообщения, но когда я пытаюсь отправить ответ, библиотека выдает исключение «Поток локального хранилища достигнут». После этого он получает еще несколько сообщений (иногда текст прерывается), но попытки отправки новых сообщений снова попадают в исключение хранилища потоков, а затем полностью прекращают прием и отправку.

Кто-нибудь нашел такую ​​проблему? Любая помощь приветствуется.

Обновление: я скомпилировал и использовал новую версию 3.8.3 и все еще могу воспроизвести ошибку. Тесты выполняются в RHEL 5.7 и Fedora 20, обе 64-битных архитектуры.

1

Решение

После нескольких дней отладки и пересчета в оболочках мы обнаружили, что виновником был неуместный указатель на структуру, которая не была удалена. Это, в частности, скрыло отсутствующий указатель из memcheck Вальгринда как «косвенную потерю».

В конце концов, проблема заключалась в сборе неустановленных указателей cms :: Session (также может происходить с другими объектами cms).

Как библиотека activemq-cpp указывает в разделе Session cms :: Session является элементом с одним потоком. Однако в нем также говорится, что созданное им Соединение управляет несколькими его действиями, для которых, среди прочего, оно сохраняет ссылку на сгенерированные Сеансы, и все это хранится в стеке потоков Соединения. Таким образом, огромное количество созданий сеанса вызовет «Достигнут предел локального хранилища потока» при заполнении емкости подключения.

4

Другие решения