1

我一直在开发一个与 ActiveMQ-cpp(库版本 3.8.2)互连的线程数据池系统。系统管理一组设备,这些设备可以定期池化,轮询结果发送到代理中的队列。答案队列可以随时通过控制消息更改,因此生产者和目的地不断变化。只有一个订阅者接收所有控制命令,并且多个线程从它们自己的会话中创建生产者和消息。所有消息都是文本消息。

所有 activemq-cpp 元素都包裹在 RAII 元素中,但在密集使用后的某个时候,连接会收到消息,但是当我尝试发送响应时,库会抛出异常,显示“已达到线程本地存储限制”。之后它接收到更多消息(有时文本被破坏)但尝试发出新消息再次陷入线程存储异常,然后完全停止接收和发送。

有没有人发现这种问题?欢迎任何帮助。

更新:我已经编译并使用了新的3.8.3版本,仍然可以重现错误。测试是在 RHEL 5.7 和 Fedora 20 中完成的,它们都是 64 位架构。

4

1 回答 1

4

经过几天在包装器中的调试和引用计数,我们发现罪魁祸首是指向未删除结构的错误指针。这特别将 Valgrind 的 memcheck 中丢失的指针隐藏为“间接损失”。

毕竟,手头的问题是未删除的 cms::Session 指针的集合(其他 cms 对象也会发生)。

正如activemq-cpp 库在 Session 部分中指出的那样,cms::Session 是一个单线程元素。但是,它还指出创建它的 Connection 控制它的几个操作,为此它保留对生成的 Sessions 的引用等,所有这些都存储在 Connection 线程堆栈中。因此,当连接容量已满时,大量的 Session 创建将触发“达到线程本地存储限制”。

于 2014-08-07T16:18:17.203 回答