1.前言"我的性格好不好! Linux没有将我的线程调度半小时!”。
几天前一位同事抱怨说:“ Linux是一个多线程系统,每个线程都有一个时间片,为什么我的程序似乎还没有被调度”,然后向我展示了执行过程。
大致归纳为以下代码逻辑。
程序启动后,仅一行“ run”开始。
输出,然后就没有了。
喝咖啡,吃瓜子,有偿钓鱼,屏幕很干净。
在理想状态下,输出“做”到输出。
每10秒执行一次任务后。
通过分析代码逻辑,我们可以看到“推断”的基础是可理解的。
代码是否正在执行是“ do”的输出。
在屏幕上,“这真的科学吗?答案是不。
Linux有一个雨露计划系统,很难在半小时内保持不变。
排程。
问题在于Linux的“行缓冲”机制。
机制。
void main(){printf(“ run ”); while(1){sleep(10); do_thing(); printf(“ do”); }} 2.行缓冲上面的printf输出目标设备由STDOUT指定,它可能指向波特率为115200的串行端口。
设备也可能指向本地图形设备。
与CPU相比,它们的速度要慢几个数量级。
它们都是为了提高机器或程序的性能并提高CPU利用率。
协调高速设备和低速设备之间的速度差异为了进行匹配,操作系统默认情况下在标准I / O上使用行缓冲机制。
首先将printf的内容存储在内存中,然后当缓冲区已满或检测到换行符时,将其输出到目标设备。
Linux上的默认行缓冲区为1024Byte,每10s输出占用2Byte,为了等待缓冲区填满,您需要等待81分钟。
了解原理之后,解决方案很简单。
方法1:强制刷新以刷新标准输出stdout #include void main(){printf(“ run ”); while(1){sleep(10); do_thing(); fflush(stdout); printf(“ do”); }}方法2:输出“ newline” #include void main(){printf(“ run ”); while(1){sleep(10); do_thing(); printf(“ do ");}} END来源:写一个解决方案,作者:吴军解决方案免责声明:本文经21ic授权发布,属于原作者,该平台提供信息存储服务,仅文章代表个人观点, 并不意味着。
这个平台的位置,如果您有任何疑问,请与我们联系,谢谢!