我正在用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线程中使用吗?还是应该完全避免?
是否应以与printf
相同的方式处理到磁盘的write
?它应该只在单独的低优先级线程中使用吗?
发布于 2018-06-04 03:49:37
幕后的printf
会触发缓冲IO的非实时(甚至阻塞)机制。
它不仅是非确定性的,而且打开了priority inversion的可能性。
你应该非常小心地在实时线程中使用它(我会说完全避免它。
通常,在延迟受限的代码中,您将对(预分配或内存映射的)环形缓冲区链使用无等待的二进制审计,并使用后台较低优先级线程(甚至是单独的进程)刷新它们。
https://stackoverflow.com/questions/50670115
复制相似问题