【问题标题】:Launching all threads at exactly the same time in C++在 C++ 中同时启动所有线程
【发布时间】: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


【解决方案1】:

正如其他人在 cmets 中所说,您不能保证线程在完全同时启动。为了解决您的总体目标:从 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 部分以保持时间戳一致

【讨论】:

  • 您好@BTable,感谢您的回复。我目前正在使用 rosbag API 本身,我基本上为三个不同的主题创建了三个不同的视图(我有三个主题),并且我在三个不同的线程上生成了三个主题。我对 ROS 相当陌生,我不知道它的所有“提示和技巧”。如果您对此有任何想法,请告诉我。
  • @AtharvaDubey 如果您使用的是 api,则没有理由使用多个线程。它将像使用文本文件一样创建并写入包文件。请参阅我的编辑以获取更多上下文和一个简短示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2017-08-27
  • 2018-11-23
相关资源
最近更新 更多