给实时时钟提供自己的线程是个好主意吗?

时间:2013-03-24 19:49:43

标签: c multithreading real-time

我对实时编程/多线程很陌生,我试图在我的带领下进行一些实际的开发。我试图为一个执行多项任务的学校项目编写程序(在C中),包括图像处理(openCV),服务网页(使用像libmicrohttpd这样的库),以及与外围设备连接。该程序将具有高度线程,每个任务基本上都是独立运行的。

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

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

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

感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

您最好的选择是使用线程安全时间吸气剂。 gettimeofday就是这样一个功能(见这里:Is the gettimeofday function thread safe in Linux?)。它提供了自unix时代以来的秒和微秒,所以应该很容易准确到记录。只要您不使用任何具有内部缓冲区的函数等,您从该函数中获取的数据取决于您自己。

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

答案 1 :(得分:0)

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