ActiveMQ-CPP 在发送时抛出"Thread local storage limit"达到

activemq-cpp throws "Thread local storage limit" reached when sending

本文关键字:Thread local limit 达到 storage ActiveMQ-CPP      更新时间:2023-10-16

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

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

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

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

经过几天的调试和对包装器的重新计数后,我们发现罪魁祸首是指向未删除的结构的错误指针。这特别隐藏了Valgrind的memcheck中丢失的指针,作为"间接丢失"。

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

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