首页 > 编程知识 正文

nanosleep导致cpu异常变高,nanosleep cpu占用高

时间:2023-05-03 19:48:01 阅读:215079 作者:4168

文章目录 背景代码模拟编译执行后输出结果分析结论

背景

某天客户反馈程序cpu占用99%,要求分析出问题,经排查发现是由于nanosleep函数使用不当导致

代码模拟 #include <time.h>#include <stdio.h>int count;void do_printbuf(){ count++; printf("do print buf called %dn",count);}int main(){ struct timespec s_time,ostime; s_time.tv_sec = 0; s_time.tv_nsec = 1000 * 1000 * 1000;//故障行 //s_time.tv_nsec = 10 *1000*1000; while(1) { do_printbuf(); printf("tv_nsec %ld,sizeof %dn",s_time.tv_nsec,sizeof s_time.tv_sec); nanosleep(&s_time,&ostime);//故障行 } return 0;} 编译执行后输出结果 do print buf called 47938tv_nsec 1000000000,sizeof 8do print buf called 47939tv_nsec 1000000000,sizeof 8do print buf called 47940tv_nsec 1000000000,sizeof 8do print buf called 47941tv_nsec 1000000000,sizeof 8do print buf called 47942 分析

编译执行后,可以看出s_time.tv.nsec正常打印并没有发生溢出的问题,但是现象表明当tv_nsec中第一个乘数为10时程序执行缓慢,100时变的更慢一点点,1000时程序疯狂打印.
查看man 手册

The structure timespec is used to specify intervals of time with nanosecond precision. It is defined as follows: struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; The value of the nanoseconds field must be in the range 0 to 999999999. 结论 timespec中tv_nsec的存在范围限制,程序没有进行范围处理导致当tv_nsec值超过999999999时,程序行为是未定义的,在不同系统,不同环境中表现不同,大多数系统表现为立即返回,不阻塞程序.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。