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也很高 创建和删除文件缓慢,删除单个文件也会出现进度条.此时查看任务管理器,会出 ...
随机推荐
- 使用 IntersectionObserver API 遇到的一些问题
root 设指定为 document.body 时不会触发更新 See the Pen document.body and IntersectionObserver by y1j2x34 (@y1j2 ...
- 关系类处理专题之创建关系类|RelationShipClass
/// <summary> /// 存在于数据库中的数据集中 /// </summary> /// <param name="mdbPath"> ...
- 记一次dubbo服务丢失的问题排查
主要环境与用到的(关键)组件: Springboot2.3.2 其中,dubbo-spring-boot-starter版本为2.7.8 zookeeper3.5.9 首先是服务报错: No prov ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序
学习操作系统原理最好的方法是自己写一个简单的操作系统. 前面铺垫了这么久,今天终于开始写程序了.本讲将介绍3个逐步深入但非常简单的程序,一方面是让大家熟悉开发流程,另一方面是顺便解决前面遇到的CPU占 ...
- AES 简介 以及 C# 和 js 实现【加密知多少系列】
〇.AES 简介 AES 的全称是 Advanced Encryption Standard,意思是高级加密标准.它的出现主要是为了取代 DES(Data Encryption StandardDat ...
- Java面试——Spring Boot
更多内容,移步IT-BLOG 一.谈谈你对 SpringBoot 的理解 简单说说我的理解:Java是一个静态语言,相比动态语言,它相对笨重,体现在我们搭建 SSM 框架写一个 Helloword 的 ...
- v-model 和 .sync
v-model的本质是父子组件间的通讯,父组件给子组件传递一个value自定义属性和input自定义事件:子组件接收value 并触发自定义事件修改value 父组件中 <Child v-mod ...
- [C++STL教程]1.vector容器是什么?实用教程来啦!超简单易懂,拿来就用
C++与传统的C语言有一个很大的区别,就是新增了标准模板库 STL(Standard Template Library),它是 C++ 标准库的一部分,不需要单独安装,只需要 #include 对应的 ...
- do { } while(){ }
1 var j=10; 2 do{ 3 console.log("十八岁以下禁止观看") 4 console.log(j); 5 j++; //j为18之前都不执行while 6 ...
- ACM-DP-数塔问题
Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告 ...