我正在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
相同吗?它应该只在单独的低优先级线程中使用吗?
答案 0 :(得分:0)
printf
会触发缓冲IO的非实时(甚至阻塞)机制。
这不仅是非确定性的,而且开启了priority inversion的可能性。
你应该非常小心地从实时线程中使用它(我会说完全避免它。
通常,在延迟绑定代码中,您将使用无等待二进制审计到(预分配或内存映射)环缓冲区链中,并使用后台优先级较低的线程(甚至是单独的进程)对它们进行刷新。