printf()的重入和性能上的问题
重入
重入:一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象
举个例子比如双核计算机多线程同时打印文本就可能把文本交替的打印出来了,不是预期要的结果
一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果
假设有这么个函数
void fun()
{
//…这个函数对FLOAT寄存器进行操作
}
假如第一次执行,有个对浮点数操作运算的结果临时存在FLOAT寄存器中,而就在这时被中断了,而中断函数或者另一个进程也调用fun函数,这时第二次调用的fun函数在执行的过程中就会破坏第一次FLOAT寄存器中的结果,这样当返回到第一次fun函数的时候,结果就不正确了。可以把fun函数理解为printf()函数。
printf()函数与硬件相关,硬件端口相当于全局变量,函数内部的全局变量,导致该函数不可重入。
性能上的问题:
上述的问题也属于性能问题。对于并发或同时执行的多进程或任务,若要正确使用printf()函数,必须互斥使用,在一个进程或任务执行printf ()时,其他使用printf()的进程或任务只能等待,不能及时显示。