c - 为实时时钟提供自己的线程是一个好主意吗?

标签 c multithreading real-time

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

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

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

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

感谢您的任何建议。

最佳答案

最好的选择是使用线程安全的时间 getter 。 gettimeofday 就是这样一个函数(参见此处: Is the gettimeofday function thread safe in Linux? )。它为您提供了自 UNIX 纪元以来的秒数和微秒数,因此对于日志记录来说应该足够准确。只要您不使用任何具有内部缓冲区等的函数,您如何处理从该函数中获得的数据取决于您。

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

关于c - 为实时时钟提供自己的线程是一个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603167/

相关文章:

c - 在C中,取消任务最基本的方法是什么?

c - for语句中的Strtok

multithreading - “full memory barrier”的反面是什么?

audio - 使用FFT的公式幅度

java - 使用 3 个线程的多线程 Java

c# - 在 Silverlight 中,如何知道代码是否在 UI 线程中运行?

c++ - 确定删除并发队列的安全性

c - long 和 int 通常大小相同的历史背景是什么?

c - 出现错误 "int&"

c++ - 在 Linux 上,命令行程序 mktemp 是否不如 C 函数 mkstemp 安全?