2

我对实时编程/多线程还很陌生,我正在尝试进行一些实际的开发。我正在尝试为一个学校项目编写一个程序(用 C 语言),该项目执行多项任务,包括图像处理(openCV)、服务网页(使用 libmicrohttpd 之类的库)以及与外围设备的接口。该程序将有大量线程,每个任务基本上都是独立运行的。

该程序的一个非常重要的部分是事件/数据记录和在外围设备上设置时钟,这需要计算机的板载时间。也就是说,不止一个线程将需要当前时间作为其任务的一部分。所以我的问题是,声明一个全局时间结构并根据单个线程的需要调用 gettime 是更好的主意,还是拥有一个始终保持当前时间的单独线程,然后每个线程都从中读取?前者听起来可能存在访问问题,而后者听起来很难以适当的频率更新。

为了更详细地了解我正在执行的任务:

  • 每当opencv检测到某个对象时,我都会保存包含时间的图像和文本日志
  • 我正在记录从外围设备收到的最后十个数据包的时间(这是一个非常低的数据速率连接)
  • 外设没有板载 RTC,所以当它连接或漂移太远时,这个程序会设置它。

感谢您的任何建议。

4

2 回答 2

3

您最好的选择是使用线程安全的时间获取器。gettimeofday就是这样一个函数(参见此处:Linux 中的 gettimeofday 函数线程安全吗?)。它为您提供自 unix 纪元以来的秒数和微秒数,因此应该很容易足够准确地进行日志记录。只要您不使用任何具有内部缓冲区等的函数,您如何处理从该函数中获得的数据都取决于您。

您还应该注意如何编写日志。最安全的方法是为每个线程使用单独的文件,但您也可以使用互斥锁。

于 2013-03-24T20:00:48.323 回答
0

您说您的设备没有 RTC。所以我期望它是一个小型嵌入式平台?如果是这样,几乎总是有一些可用的硬件计时器。如果是这样,您可以使用中断或使用线程来轮询计时器值。并且不要忘记记录时间调整,以便以后进行评估。

于 2013-03-24T21:00:54.627 回答