RT线程中的printf

时间:2018-06-03 19:18:51

标签: linux multithreading real-time

我正在Linux中编写一个多线程应用程序。

内核中没有RT补丁,但我使用优先级的线程。

在检查执行printf所需的时间时,我会在每次测量时测量不同的值,尽管它是在最高优先级的线程中完成的:

if(clock_gettime(CLOCK_MONOTONIC, &start))
{ /* handle error */ 
}

for(int i=0; i< 1000; i++)
   printf("hello world");

if(clock_gettime(CLOCK_MONOTONIC, &end))
{ 
 /* handle error */ 
}
elapsedSeconds = TimeSpecToSeconds(&end) - TimeSpecToSeconds(&start);

为什么printf会以非确定性的方式改变时间,即每个 如何printf与RT线程一起使用?

可以在RT线程中使用还是应该完全避免?

write到磁盘的处理方式应与printf相同吗?它应该只在单独的低优先级线程中使用吗?

1 个答案:

答案 0 :(得分:0)

引擎盖下的

printf会触发缓冲IO的非实时(甚至阻塞)机制。

这不仅是非确定性的,而且开启了priority inversion的可能性。

你应该非常小心地从实时线程中使用它(我会说完全避免它。

通常,在延迟绑定代码中,您将使用无等待二进制审计到(预分配或内存映射)环缓冲区链​​中,并使用后台优先级较低的线程(甚至是单独的进程)对它们进行刷新。