Pol*_*ino 0 c++ multithreading boost mutex ros
我有一个运行两个线程的ROS节点,它们都共享同一个类.该类具有两组参数"to read"和"to write"以在控制循环中更新.有两种情况会出现问题.
我的程序是一个节点,它将控制数据泵入四旋翼飞行器(情况1)并读取无人机数据以获得反馈(情况2).在这里,我可以控制线程A的执行频率,我知道线程B可以与其读/写外部源通信的频率.
线程A从控制源读取数据并更新"读取"参数.线程B不断读取这个"读取"参数并将它们写入无人机源.我的观点是,我不介意我是否错过了线程已读取的某些值,但是线程B可能会读取某些不是"真实"值的东西,因为线程A正在写入或类似的东西?
写入"读取"参数后的线程B读取将更新第二组"写入"的无人机状态.线程A再次需要读取这个"写入"参数并将它们写回控制源,就像我不关心是否遗漏了一个值因为我将获得下一个.
那么我需要一个互斥量吗?或者读取线程只会遗漏一些值但读取的内容将是正确且一致的?
BTW:我使用boost:threads来实现线程B作为线程A它是ROS节点本身.
数据竞争是未定义的行为.即使硬件保证了原子访问,甚至你的线程也不会因为时间而同时实际访问相同的数据.在C++中没有良性数据竞争这样的东西.你可以幸运的是,未定义的行为可以达到你想要的效果,但你永远无法确定,每一个新的编译都可以破坏一切(不仅仅是错过的写入).我强烈建议你使用std :: atomic.它很可能会生成几乎相同的代码,但保证始终有效.
| 归档时间: |
|
| 查看次数: |
428 次 |
| 最近记录: |