Я занимаюсь разработкой многопоточной системы пула данных, связанной с ActiveMQ-cpp (версия библиотеки 3.8.2). Система управляет группой устройств, которые могут периодически объединяться, результаты опроса отправляются в очередь в посреднике. Очередь ответов может быть изменена в любое время с помощью управляющего сообщения, поэтому производители и адресаты постоянно меняются. Только один подписчик получает все управляющие команды, а несколько потоков создают производителей и сообщения из своих собственных сеансов. Все сообщения являются текстовыми сообщениями.
Все элементы activemq-cpp обернуты в элементы RAII, но в какой-то момент после интенсивного использования соединение получает сообщения, но когда я пытаюсь отправить ответ, библиотека выдает исключение «Поток локального хранилища достигнут». После этого он получает еще несколько сообщений (иногда текст прерывается), но попытки отправки новых сообщений снова попадают в исключение хранилища потоков, а затем полностью прекращают прием и отправку.
Кто-нибудь нашел такую проблему? Любая помощь приветствуется.
Обновление: я скомпилировал и использовал новую версию 3.8.3 и все еще могу воспроизвести ошибку. Тесты выполняются в RHEL 5.7 и Fedora 20, обе 64-битных архитектуры.
После нескольких дней отладки и пересчета в оболочках мы обнаружили, что виновником был неуместный указатель на структуру, которая не была удалена. Это, в частности, скрыло отсутствующий указатель из memcheck Вальгринда как «косвенную потерю».
В конце концов, проблема заключалась в сборе неустановленных указателей cms :: Session (также может происходить с другими объектами cms).
Как библиотека activemq-cpp указывает в разделе Session cms :: Session является элементом с одним потоком. Однако в нем также говорится, что созданное им Соединение управляет несколькими его действиями, для которых, среди прочего, оно сохраняет ссылку на сгенерированные Сеансы, и все это хранится в стеке потоков Соединения. Таким образом, огромное количество созданий сеанса вызовет «Достигнут предел локального хранилища потока» при заполнении емкости подключения.