ntp导致其他线程卡顿原因总结
这个是在项目开发中遇到的一个比较严重的问题,第一影响到主界面的播放卡顿,第二影响到我这边线程同样卡顿,按道理来说两个没有数据交互的线程应该没有任何影响,改为detach模式也没用,最后定位到居然是单独的ntp线程影响到这两个线程的运行了,最后跟踪下去是popen和fgets的影响。
都知道调用system命令无法获取返回值,所以很多时候采用popen来获取,但是有一个问题popen+fgets获取返回值的时候,本身popen并不阻塞,而是通过fgets使其处于阻塞状态,所以当system命令执行以后需要很长时间fgets获取返回值的时候,这时候当前ntp 线程一直处于阻塞等待数据的到来(但是为啥会阻塞其他线程呢???网上google,百度搜了很多解释的都模凌两可),最后给出我解决的方式把。
ntp部分代码如下:
void* NtpDate::ntpSyncProc(void* args)
{
TvsStateManager *tvs = (TvsStateManager *)args;
if(tvs != NULL)
{
bool update = false;
float offset = 0;
std::string cmd = "ntpdate ";
cmd.append(mServer);
// cmd.append(" &");
while(1)
{
LogE("##### Start execute ntpdate to sync time,ntp server(%s).\n",mServer.c_str());
//system(cmd.c_str());
FILE *freport = popen(cmd.c_str(), "r");
int fd = fileno(freport);
int flags;
flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
if (freport == NULL) {
LogW("Failed to execute ntpdate.\n");
}
else {
char echo[1024];
// usleep(10 * 1000 * 1000);
if(fgets(echo, sizeof(echo), freport) != NULL)
{
char *ntp = strstr(echo, "offset");
if (ntp != NULL) {
if (sscanf(ntp, "offset %f sec", &offset) == 1) {
update = true;
LogE("Adjust time offset %f second.\n", offset);
tvs->sendMessage(new Message(TvsStateManager::NtpDateMsg, reinterpret_cast<int &>(offset)));
}
}
if (update == false) {
LogE("Sync time failed: %s\n", echo);
}
}
pclose(freport);
}
usleep(mPeriod * 1000 * 1000);
}
}
return NULL;
}
popen怎么使用的不解释了,说出关键部分:1.首先是将fgets阻塞模式改为了非阻塞模式使用了fcntl()函数,但是测试的过程发现由于非阻塞模式fgets还未获得数据就已经抛弃了,所以加了usleep睡眠10 s来获取,因为ntp返回值获得测试时大概是6s左右,所以设置10s保证能100%获得,当然可以设置更大,因为调用popen就已经执行了system命令,所以对于校时并不影响。2.另外也可以采用select模式改为非阻塞模式,代码就不贴了。3.此外还可以采用“&”后台运行(网上说"&"其实已经是非阻塞模式了,具体对不对不是很清楚),反正采用以上三种方式都可以解决ntp线程卡顿原因,以上三种方式我都试过。
ntp导致其他线程卡顿原因总结的更多相关文章
- H5:加载原理,慢加载和卡顿原因分析,
前端H5工作原理: 请求和显示原理 H5页面卡顿原因分析: 1.动画太多:渲染重绘占用GPU 2.页面操作导致重绘频繁 3.页面元素复杂:资源类标签太多(图像/视频/dom树太长) 4.内置webvi ...
- android TextView SetText卡顿原因
[android TextView SetText卡顿原因] 不要用wrap_content即可. 参考:http://blog.csdn.net/self_study/article/details ...
- 解决由于显卡驱动BUG导致桌面右键卡顿的问题:bat文件源码
@ ECHO OFF%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...
- Win10重命名文件夹导致资源管理器卡顿的解决办法
我本机使用的是 Win10 1607,不清楚是因为什么原因导致重命名文件夹时资源管理器会被卡死,找了很长时间终于找到了解决办法,现在我把步骤粘出来以便后续遇到相同问题的朋友能及时解决. 其实操作很简单 ...
- Android中app卡顿原因分析示例
在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. =========== ...
- React Image加载图片过大导致ListView滑动卡顿
今天莫名的发现ListView加载Item很卡,一顿一顿的... ListView Item 中只加载一张图片,小编从百度爸爸上随便复制的链接,这张图片很大,以致埋下如此大坑... Image的Sty ...
- 频繁GC会造成卡顿
频繁GC会造成卡顿 https://www.cnblogs.com/qcloud1001/p/9525078.html 一款app除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的要求 ...
- Android异常与性能优化相关面试问题-ui卡顿面试问题详解
UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...
- 界面使用webview,并且webview里面有图片进行自动切换导致界面上滚动条卡顿。
最近的项目是用webview做的界面,但是在界面顶端加了android本地动画效果的横向滚动条.当webview里面的图片切换时导致滚动条动画卡顿. 1:setLayerType(View.LAYER ...
- Explorer内存占用偶尔变高导致卡顿
症状: 打开 "这台电脑",加载缓慢.此时查看任务管理器,explorer内存可能飙升到几G.cpu也很高 创建和删除文件缓慢,删除单个文件也会出现进度条.此时查看任务管理器,会出 ...
随机推荐
- css卡片样式
.view-1-user-card { margin: 20px 5% 10px 5%; height: 124px; width: 90%; background: linear-gradient( ...
- 用for打印九九乘法表
package com.jiemo.struct;public class ForShabi4 { public static void main(String[] args) { //1.先打印第一 ...
- 寄存器与RAM的区别
转自:https://blog.csdn.net/qq_18191333/article/details/106912668 概述 寄存器是"存储设备",主要用于存储和检查微型计算 ...
- 解决vue项目中文出现乱码
出现中文乱码的文件以ediplus打开,右上方有点击file选择sall As....另存为 下方有encoding 选择utf-8 ,覆盖以前的文件,就好了.
- FastJson参数
名称 含义 备注 QuoteFieldNames 输出key时是否使用双引号,默认为true UseSingleQuotes 使用单引号而不是双引号,默认为false WriteMapNull ...
- [极客大挑战 2019]PHP 1
进入后提示我们网页有备份文件,这边使用爆破工具,网页会down掉 随便随便猜了一下www.zip,成功下载源码 常见的网页备份有 .git ~ .swp .swo .bak .zip 还不知道是什么题 ...
- 使用EFCore的Code First和MySql数据库迁移
1. 感慨一下 随着.net core的持续更新和升级,至少对于从事.net开发的人员和即将踏入这个领域的人来说,我相信大家的热情还是持续高涨的.国内的.net开发生态相比于之前来说,还是大有所好转的 ...
- 从零开始学习Java系列之Java运行机制与跨平台特性
全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!并带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,给你带来具有足够启迪的思考-- 在上一篇文章中,壹哥给大家介绍了J ...
- Salesforce LWC学习(三十三) lightning-datatable 翻页bug处理
本来lightning-datatable这种标签,基本上任何的项目都会用到而且很精通,所以当时感觉没有太大的单独一篇写的必要,在Salesforce LWC学习(三十) lwc superbadge ...
- 非常小的一个东西,Spring依赖注入Bean类型的8种情况
大家好,我是三友~~ 今天来讲一个可能看似没有用但是实际又有点用的一个小东西,那就是@Autowired支持注入哪些Bean的类型. 为啥要讲这个呢? 故事说起来可能就比较长了. 不过长话可以短说,仅 ...