linux - RT线程中的printf

标签 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 相同?它应该只在单独的低优先级线程中使用吗?

最佳答案

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

它不仅是不确定的,而且开启了 priority inversion 的可能性.

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

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

关于linux - RT线程中的printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50670115/

相关文章:

python - 获取 Jupyter notebook 实时显示 matplotlib 图形

python - 收集包元数据 (repodata.json) :/Killed

c - 使用 MCU-ATMega 1280 进行多中断实时数据记录

linux - 错误 : ld. 所以:无法预加载对象 LD_PRELOAD:忽略

ios - iOS 应用程序中多个对象的多个 Realm

java - 如何构建多线程套接字服务器

linux - 抢占式线程与非抢占式线程

real-time - 在线与实时

Linux `perf record --append` 选项缺失

python - 获取 ffmpeg 的结果并将其传递给 python 脚本