线程安全定时来对齐在多个线程中收集的数据-QElapsedTimer是否工作

Thread-safe timing to align data collected in multiple threads- does QElapsedTimer work?

本文关键字:线程 数据 -QElapsedTimer 工作 是否 定时 安全 对齐      更新时间:2023-10-16

我正在开发一个应用程序(c++),该应用程序利用多种类型的硬件同时收集各种类型的数据。常见的使用模式是在各自的线程中运行这些设备的不同接口(眼睛跟踪、运动跟踪、可视化等),因此它们尽可能少地相互干扰。我不需要保证线程实际执行的时间非常精确,我知道这需要硬件定时器。不过,我想做的是让线程能够查询某种类型的中央计时器,他们可以定期使用该计时器为收集的数据添加时间戳,这样以后就可以(半精确地)对齐数据进行分析。毫秒级精度适用于此目的。

该应用程序将Qt用于gui目的,因此我认为QElapedTimer将是一个潜在的解决方案。然而,文档声明所有方法都是可重入的,而不是线程安全的。对于希望使用这种定时功能的每个线程,这需要一个唯一的QElapsedTimer对象,我说得对吗?如果是这种情况,我的方法是要求每个线程初始化阻塞函数(在主线程中执行)中的定时。初始化将涉及创建一个包装器对象,该对象组合了一个计时器+与"主"计时器的偏移量,以便创建的任何/所有计时器都与主计时器"同步"。这将在主线程中完成,以便从非线程安全的原始计时器获得偏移。

这是一种合理的方法,还是有一种更好的"标准"(设计模式)方法可以让我使用?或者,有没有一个不同的图书馆更适合我的目的?目前我正在使用Windows(7和XP),但该应用程序最终将是跨平台的。

在Qt中,您有方便的类,如QMutexLocker,用于进行同步调用。因此,您可以将QMutexLocker与QMutex一起使用,以便将函数标记为线程安全的,然后您可以跨线程使用QElapsedTimer而不会出现任何问题。

Reentrant意味着如果您想同时访问,每个线程至少需要有一个不同的实例。您也可以使用QDateTime来生成时间戳,但这也不是线程安全的。因此,我认为最好对该方法的访问进行互斥。