我一直在开发一个与ActiveMQ-cpp(库版本3.8.2)互连的线程数据池系统。系统管理可以定期合并的一组设备,将轮询结果发送到代理中的队列。可以通过控制消息随时更改答案队列,因此生产者和目的地会不断更改。只有一个订阅者接收所有控制命令,并且多个线程从他们自己的会话中创建生成器和消息。所有消息都是TextMessages。
所有activemq-cpp元素都包含在RAII元素中,但在密集使用后的某个时刻,连接会收到消息,但是当我尝试发送响应时,库会抛出异常读取"线程本地存储限制达到& #34 ;.之后它会收到更多消息(有时文本被破坏)但尝试发出新消息会再次出现在线程存储异常中,然后完全停止接收和发送。
有人发现过这种问题吗?欢迎任何帮助。
更新:我编译并使用了新的3.8.3版本,仍然可以重现错误。测试在RHEL 5.7和Fedora 20中完成,均为64位架构。
答案 0 :(得分:4)
经过几天的调试和在包装器中重新计数后,我们发现罪魁祸首是指向一个没有被删除的结构的错误指针。这特别是将Valgrind的memcheck中缺少的指针隐藏为"间接损失"。
毕竟,手头的问题是一组未删除的cms :: Session指针(也会发生在其他cms对象上)。
作为Session部分中的activemq-cpp library points out,cms :: Session是单个线程元素。但是,它还声明创建它的Connection控制它的几个动作,为此它保持对生成的Sessions的引用,所有这些都存储在Connection线程堆栈中。因此,大量的会话创建将触发"线程本地存储限制达到"当连接容量已满时。