关于AsyncSpinner处理双订阅者回调的线程行为理解确认
你的理解完全正确
- ROS有个默认规则:同一个订阅者的回调函数,绝对不能被多个线程同时执行,这是为了避免同一份订阅消息的回调出现数据竞态问题做的限制。
- 对应你说的场景:
- 因为
sub1的消息频率远高于sub2,全局回调队列肯定会被大量cb1占满,形成类似[cb1, cb1, cb1, cb1, cb2, cb1, ...]的队列结构。 - 当其中一个线程开始执行耗时极长的
cb1时,剩下的3个线程就算闲着,也碰不了队列里后面的cb1——毕竟违反了同一订阅者回调串行的规则。 - 而队列里的
cb2被前面一堆cb1堵着,根本轮不到执行,最后整个进程的运行状态就跟单线程自旋没两样,必然会卡顿。
- 因为
内容的提问来源于stack exchange,提问作者code_monkey
相关产品推荐
相关产品推荐

