我一直在开发一个与ActiveMQ互连的线程数据池系统(库版本3.8.2)。系统管理一组设备,这些设备可以定期池化,轮询结果被发送到代理中的队列。应答队列可以通过控制消息在任何时间内更改,因此生产者和目的地都会不断更改。只有一个订阅服务器接收所有控制命令,多个线程从它们自己的会话中创建生产者和消息。所有消息都是TextMessages。
所有activemq-cpp元素都封装在RAII元素中,但是在密集使用之后,连接会接收消息,但是当我试图发送响应时,库会抛出一个异常,即“已达到的线程本地存储限制”。之后,它会接收更多的消息(有时文本被破坏),但是试图发出新消息的尝试再次出现在线程存储异常中,然后完全停止接收和发送。
有人发现这样的问题了吗?欢迎任何帮助。
更新:我已经编译并使用了新的3.8.3版本,并且仍然可以复制错误。测试是在RHEL5.7和Fedora 20中进行的,它们都是64位架构。
发布于 2014-08-07 16:18:17
经过几天的调试和包装中的重新计算,我们发现罪魁祸首是一个指向未被删除的结构的错误指针。这尤其将丢失的指针隐藏在瓦伦丁的备忘录中,作为一种“间接损失”。
毕竟,当前的问题是未删除的cms::会话指针的集合(也会发生在其他cms对象中)。
作为会话部分中的activemq-cpp库指出,cms::Session是单个线程元素。但是,它还声明创建它的连接控制它的几个操作,其中它保存了对生成的会话的引用,所有这些都存储在连接线程堆栈中。因此,当连接容量满时,大量的会话创建将触发“已达到的线程本地存储限制”。
https://stackoverflow.com/questions/25125565
复制相似问题