【发布时间】:2021-11-21 00:58:34
【问题描述】:
我有 Rosbag 文件,其中包含有关各种主题的消息,每个主题都有自己的频率。这些数据是从硬件设备流数据中捕获的,所有主题的数据将同时“到达”以用于不同的算法。
我希望使用 rosbag 文件来模拟这一点(将其视为每个主题都关联了一个数据数组),并且必须同时启动此数据流处理过程,以便数据可以同步。
我通过在不同线程上启动不同的发布者来做到这一点(我也对其他方法持开放态度,这是我能想到的唯一一种方法。),但是线程不会同时启动,到时间线程3 次启动,线程 1 将大大领先。
我怎样才能做到这一点?
编辑 - 我知道在完全相同的时间发射是不可能的,但也许我也可以在彼此非常接近的发射中逃脱。有什么办法可以确保这一点?
Edit2 - 由于主要目的是让数据流同步,我想知道线程的预热效果(假设线程 1 从 3.3GHz 开始,到线程 2 从 3.2 开始时达到 4.2GHz)。这会产生显着的效果吗(我总是可以在开始发布过程之前对其进行预热,但我很好奇它是否会产生明显的效果)
TIA
【问题讨论】:
-
简单地说,你不能。这在物理上是不可能的
-
使用屏障在一个检查点同步多个线程。但是,即使那样,当您释放所有这些时,也不能保证它们都会在您需要时由操作系统安排。没有在硬实时操作系统上运行,我不知道你怎么能绝对保证,否则。
-
@TanveerBadar 硬实时操作系统也无法做到这一点。它可以保证达到最后期限,或者如果没有达到最后期限,将以某种方式发出错误信号(例如,系统的执行终止)。如果在启动一组线程的过程中遇到了最后期限,那仍然不能保证所有线程都在完全相同的时间启动。如果某个操作实际上是由进程执行的,那么最后期限为零(即启动进程和结束进程之间的时间)是不可能的。
-
您熟悉实时开发和硬实时约束吗?首先,您需要一个频率(例如每 2 毫秒更新一次计算数据),然后您应该找出在多少线程上运行了多少算法,以及如何实现每个算法“完成”对你的硬时间约束,别想着下手。但是当然,例如,将开头与数据屏障“同步”也是有意义的。
-
我也不会启动和停止线程。您需要实现工作线程,您可以使用工作线程来提供工作,如果没有工作则处于空闲状态
标签: c++ multithreading concurrency ros rosbag