这个是在项目开发中遇到的一个比较严重的问题,第一影响到主界面的播放卡顿,第二影响到我这边线程同样卡顿,按道理来说两个没有数据交互的线程应该没有任何影响,改为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导致其他线程卡顿原因总结的更多相关文章

  1. H5:加载原理,慢加载和卡顿原因分析,

    前端H5工作原理: 请求和显示原理 H5页面卡顿原因分析: 1.动画太多:渲染重绘占用GPU 2.页面操作导致重绘频繁 3.页面元素复杂:资源类标签太多(图像/视频/dom树太长) 4.内置webvi ...

  2. android TextView SetText卡顿原因

    [android TextView SetText卡顿原因] 不要用wrap_content即可. 参考:http://blog.csdn.net/self_study/article/details ...

  3. 解决由于显卡驱动BUG导致桌面右键卡顿的问题:bat文件源码

    @ ECHO OFF%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...

  4. Win10重命名文件夹导致资源管理器卡顿的解决办法

    我本机使用的是 Win10 1607,不清楚是因为什么原因导致重命名文件夹时资源管理器会被卡死,找了很长时间终于找到了解决办法,现在我把步骤粘出来以便后续遇到相同问题的朋友能及时解决. 其实操作很简单 ...

  5. Android中app卡顿原因分析示例

    在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. =========== ...

  6. React Image加载图片过大导致ListView滑动卡顿

    今天莫名的发现ListView加载Item很卡,一顿一顿的... ListView Item 中只加载一张图片,小编从百度爸爸上随便复制的链接,这张图片很大,以致埋下如此大坑... Image的Sty ...

  7. 频繁GC会造成卡顿

    频繁GC会造成卡顿 https://www.cnblogs.com/qcloud1001/p/9525078.html 一款app除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的要求 ...

  8. Android异常与性能优化相关面试问题-ui卡顿面试问题详解

    UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...

  9. 界面使用webview,并且webview里面有图片进行自动切换导致界面上滚动条卡顿。

    最近的项目是用webview做的界面,但是在界面顶端加了android本地动画效果的横向滚动条.当webview里面的图片切换时导致滚动条动画卡顿. 1:setLayerType(View.LAYER ...

  10. Explorer内存占用偶尔变高导致卡顿

    症状: 打开 "这台电脑",加载缓慢.此时查看任务管理器,explorer内存可能飙升到几G.cpu也很高 创建和删除文件缓慢,删除单个文件也会出现进度条.此时查看任务管理器,会出 ...

随机推荐

  1. VS Code中使用live Server

    live server可以实时查看代码更改后的变化.测试十分快速. 1.安装live server 在扩展中搜索 live server,然后点击安装.等待安装完毕进行下一步配置. 2.打开设置界面: ...

  2. NX 二次开发 多个功能集成一个DLL的方法

    用C++做NX二次开发,一个功能建一个工程,管理起来很不方便,在网上找了些资料学习,成功的把多个功能做到一个工程里(多功能集成到一个DLL). 1.首先要了解外挂的菜单文件的基础,要实现多个功能集合在 ...

  3. jenkins freestyle deploy web

    gitlab connection 选择定义好的gitlab仓库 参数化构建过程 git参数 名称 branch 描述 自定义 参数类型 分支 默认值 $branch 选项参数 名称 Status 选 ...

  4. MySQL 索引的介绍

    参考:https://www.cnblogs.com/aspirant/p/9214485.html 参考:https://blog.codinglabs.org/articles/theory-of ...

  5. JDK 7 HashMap 并发情况下的死锁问题

    目录 问题描述 详细解释 问题描述 JDK7的 HashMap 解决冲突用的是链表,在插入链表的时候用的是头插法,每次在链表的头部插入新元素.resize() 的时候用的依然是头插,头插的话,如果某个 ...

  6. 理解Map-构建关联数组

    理解Map 要更深入理解map,学习如何构建关联数组是很有帮助的,以下是简单实现 package org.example.onjava.senior.example03collection.map; ...

  7. 👋 和我一起学【Three.js】「初级篇」:0. 总论

    「和我一起学 XXX」是我 2023 年的一个新企划,目的是向读者(也包括未来的自己)介绍我正在学习的某项新技术.文章会通过长期反复迭代的方式保持其内容的新鲜度.文章有较大内容更新时,会在文章开头进行 ...

  8. Github学生认证具体步骤

    具体步骤展示 一.进入相关的申请地址 地址在此:https://education.github.com/pack/ 二.选中右上方的Student,然后选择第二个选项 在我们已经注册号Github账 ...

  9. Android笔记--Application

    Application生命周期 在APP运行过程中有且仅有一个Application对象贯穿整个生命周期 Application全局变量 实例化: 声明全局变量:

  10. 声网深度学习时序编码器的资源预测实践丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网大后端智能运营算法团队 算法工程师@黄南薰. 随着深度学习技术的发展,编码器的结构在构建神经网络中成为了热门之选,在计算机视觉领域有众多成功案 ...