首页 > 解决方案 > 在 C++ 中同时启动所有线程

问题描述

我有 Rosbag 文件,其中包含有关各种主题的消息,每个主题都有自己的频率。该数据是从硬件设备流数据中捕获的,来自所有主题的数据将同时“到达”以用于不同的算法。
我希望使用 rosbag 文件来模拟这一点(将其视为每个主题都关联了一个数据数组),并且必须同时启动此数据流处理过程,以便数据可以同步。

我通过在不同线程上启动不同的发布者来做到这一点(我也对其他方法持开放态度,这是我能想到的唯一方法。),但是线程不会同时启动,到线程 3 启动时,线程 1 将大大领先。

我怎样才能做到这一点?

编辑 - 我知道在同一时间发射是不可能的,但也许我也可以通过彼此非常接近的发射而逃脱。有什么办法可以确保这一点?

Edit2 - 由于主要目的是在同步中获取数据流,我想知道线程的预热效果(假设 thread1 从 3.3GHz 开始,到 thread2 从 3.2 开始时达到 4.2GHz)。这会产生显着影响吗(我总是可以在开始发布过程之前对其进行预热,但我很好奇它是否会产生明显的影响)

TIA

标签: c++multithreadingconcurrencyrosrosbag

解决方案


正如其他人在评论中所说,您不能保证线程在完全相同的时间启动。为了解决您的总体目标:从 ROS 的角度来看,您正在以错误的方式解决这个问题。您应该使用rosbag api,而不是手动发布数据并尝试使其同步。这样,您实际上可以保证消息具有相同的时间戳。请注意,这并不能保证它们会同时发送出去因为它们不会。您可以像这样直接将消息放入包文件中

import rosbag
from std_msgs.msg import Int32, String

bag = rosbag.Bag('test.bag', 'w')

try:
    s = String()
    s.data = 'foo'

    i = Int32()
    i.data = 42

    bag.write('chatter', s)
    bag.write('numbers', i)
finally:
    bag.close()

对于包含Header字段的更复杂类型,只需编辑该header.stamp部分以保持时间戳一致


推荐阅读