apache / rocketmq-client-cpp

Apache RocketMQ cpp client
https://rocketmq.apache.org/
Apache License 2.0
360 stars 158 forks source link

程序启动了两个Producer,程序退出时,关闭第二个Producer时 coredump #468

Closed HUHANK closed 3 months ago

HUHANK commented 4 months ago

问题描述:程序因业务需求启动了两个producer,一个consumer,consumer和第一个producer能成功关闭,关闭第二个producer时,发生段错误

程序退出时日志image

Coredump文件的调用堆栈信息image

rocketmq api打印的日志image

请大神帮忙看看这是什么问题,不胜感谢!@ifplusor

ifplusor commented 4 months ago

@HUHANK 相同 instance name 下的多个consumer/producer对象的 shutdown 不是线程安全的,我怀疑是遇到了并发问题。

HUHANK commented 4 months ago

@HUHANK 相同 instance name 下的多个consumer/producer对象的 shutdown 不是线程安全的,我怀疑是遇到了并发问题。

我添加代码保证两个Producer一前一后关闭,崩溃的频率有降低,但是还是有崩溃,下面是崩溃的最新的调用堆栈信息: image

异常我代码里面catch不到

ifplusor commented 4 months ago

@HUHANK consumer的关闭也要同步。建议你不同的对象使用不同的instance name,之样client_factory是独立的,相互不会有影响。这样shutdown也不用做同步了。

不过你这个错误栈的出现比较奇怪,我想象不出来这个lock为什么出错。因为从时序上看,io_service还在运行,说明consumer还没有unregister,也就意味着client_factory不会销毁,这里的lock不应该出错的。

HUHANK commented 3 months ago

@ifplusor 确实如您所说,设置不同的instance name之后程序停止就不会崩溃了,正常了,非常感谢! 💯