ActiveMQ-CPP 在发送时抛出"Thread local storage limit"达到
activemq-cpp throws "Thread local storage limit" reached when sending
我一直在开发一个与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是一个单线程元素。然而,它还声明创建它的连接控制它的几个动作,为此它保留对生成的会话的引用,所有这些都存储在连接线程堆栈中。因此,当连接容量已满时,大量的会话创建将触发"线程本地存储限制已达"。
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- "local scope"中的 C++ 初始化静态变量
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 嵌入式设备 -> std::thread -> FreeRTOS?
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 在 /usr/local/lib 下找不到库
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- C++编译器错误"cannot be thread-local because it has non-POD type""
- 消除警告"construction of local static object is not thread-safe"
- TLS 变量上的"illegal thread-local reference to regular symbol"错误
- ActiveMQ-CPP 在发送时抛出"Thread local storage limit"达到