我正在 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
相同?它应该只在单独的低优先级线程中使用吗?
最佳答案
printf
在后台触发缓冲 IO 的非实时(甚至阻塞)机制。
它不仅是不确定的,而且开启了 priority inversion 的可能性.
你应该非常小心地从实时线程使用它(我会说完全避免它。
通常,在延迟限制代码中,您将使用无等待二进制审计进入(预分配或内存映射)环形缓冲区链,并使用后台较低优先级线程(甚至单独的进程)刷新它们。
关于linux - RT线程中的printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50670115/