浅谈0/1切换

 

前言:
  做过GUI开发的同学, 都知晓双缓存机制. 其过程为先把所有的场景和实体对象画到一个备份canvas, 然后再把备份canvas的内容整个填充真正的画板canvas中. 如果不采用双缓存机制, 你的画面有可能会出现闪烁和抖动.
  究其原因是整个绘制过程, 包含清屏, 绘制场景和各个实体. 其耗时远远大于单个canvas的复制. 进而导致CPU写canvas的速率小于LCD读取canvas的速率. 这样就出现闪烁的现象了.
  在后台服务中, 也会遇到类似的情形: 当数据/资源需要更新时, 采用直接增量更新的方式代价大(耗时长, 阻塞服务可用/实时响应), 由此引入back buffer,做0/1切换.
  本文以"配置文件热载更新"为例, 着重介绍0/1切换的思路和优化技巧.

热载更新:
  以往更新配置时, 往往需要重启服务进程. 为了提高服务的可用性, 更方便运维.
  采取的改进方式是:
  1) 引入配置中心服务(ConfigServer)
  把模块的配置文件搁置在ConfigServer中, 具体模块从ConfigServer中获取(拉起/通知).
  2) 监控本地配置文件变更
  进程模块通过定期轮询/事件触发的方式, 感知配置文件是否发生变化, 若发生变化, 则重新载入.
  但无论采用何种方式, 势必存在切换过程.

切换特点:
  把切换的双方定义为前端和后端, 前端资源往往被N个线程访问(静态只读), 后端资源往往是一个线程更新写. 于是就形成了一个N读1写的格局.
  具体在c/c++实现时, 切换过程往往就是一个指针的重新赋值, 十分简单.
  但问题也就隐藏在这了, 在切换后的旧资源销毁过程中, 存在多线程的竞态冲突风险.
  
  有人可能会提议, 如果对资源的访问资源的切换相同的锁保护, 就没有这个问题. 但在低频率切换的场景下, 加锁带来的性能损失, 有些得不偿失.

无锁0/1切换:
  是否存在无锁的切换方式呢?
  1). 延迟销毁
  工作线程持有并访问旧资源句柄时间不长, 可以设定一个时间窗口, 该时间窗口内属于保护期, 禁止对旧资源进行销毁.
  
  注: 在绝大多数场景下, 该方案满足条件. 只是理论上, 不排除低概率事件.
  2). 带引用计数的智能指针切换
  我们借助boost的shared_ptr来构建切换的小例子

#include <boost/shared_ptr.hpp>#include <stdint.h>
#include <stdio.h>class Config {
};class DataCenter {
public:DataCenter() {}void init() {active_idx = 0;switchover[active_idx].reset(new Config());}// *) 切换函数, 由更新线程调用void swith() {uint32_t unactive_idx = (active_idx == 0) ? 1 : 0;uint32_t old_active_idx = active_idx;// *) 新资源ready    switchover[unactive_idx].reset(new Config());// *) 正式切换active_idx = unactive_idx;// *) 旧资源reset, 引入计数减一switchover[old_active_idx].reset();}// *) 访问资源, 由前端线程调用boost::shared_ptr<Config> getConfig() {return switchover[active_idx];}private:volatile uint32_t active_idx;// *) 切换数组boost::shared_ptr<Config> switchover[2];
};

  巧用boost::shared_ptr内部有个原子计数器代理指针, 借助RAII的思想完美的实现了无引用时的自动清理工作. 也避免了上述的竞态冲突.

总结:
  在服务模块中的0/1切换有很多, 这边简述了下解决方案, 没有细致展开, 权当个人的学习笔记.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

   

 

转载于:https://www.cnblogs.com/mumuxinfei/p/4466000.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Action和Func区别

Action<>和Func<>其实都是委托的【代理】简写形式。 简单的委托写法&#xff1a; 1 //普通的委托2 public delegate void myDelegate(string str);3 4 //Delegate委托调。5 myDelegate dDelegate new myDelegate(SayHellow);6 dDelegate("Mr wang");7 8…

最好的android one手机,最高配置的Android One手机登场 LG推出G7 One与G7 F

原标题&#xff1a;最高配置的Android One手机登场 LG推出G7 One与G7 F集微网消息&#xff0c;Android One原本是谷歌与中国台湾的联发科共同开发的一个项目&#xff0c;旨在让手机制造商打造低成本的智能手机&#xff0c;这些手机主要是销售给新兴市场上的近10亿潜在用户。随着…

vs代码模板制作

VS2008代码模板制作 一&#xff0c;类模板制作&#xff1a; 路径&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class.zip 操作&#xff1a;打开Class.cs文件&#xff0c;编辑内容如下&#xff1a; // <…

pads导出坐标文件html,【教程】PADS如何导出SMT贴片机用的坐标文件

找到一个好办法&#xff0c;用wps的Excel软件的话&#xff0c;将脚本进行如下修改即可。修改前&#xff1a;Sub ExportToExcel (txt As String)FillClipboardDim xl As ObjectOn Error Resume NextSet xl GetObject(,"Excel.Application")On Error GoTo ExcelError …

avalon框架,简单的MVVM

今天我又要挑战一次一个高大上的公司了 但是看着jd有点忧伤了要求如下 基本要求&#xff1a;1、熟悉 HTML / CSS / JS 并有良好的代码风格&#xff1b;2、理解 Web 标准&#xff0c;语义化&#xff0c;可以解决主流浏览器及不同版本的兼容性问题&#xff1b;3、熟悉常见框架&am…

html锚点反向联动,小程序菜单左右联动

最近做小程序的时候&#xff0c;产品提了一个需求&#xff1a;1.左侧的菜单栏和右侧的菜单可分别滚动&#xff0c;滚动左侧不影响右侧&#xff0c;滚动右侧左侧随之联动高亮显示所在的菜单分类。2.点击下方左侧导航菜单栏&#xff0c;高亮显示被点击的菜单分类&#xff0c;右侧…

第6/24周 聚集索引

上个星期我向你介绍了堆表&#xff08;heap tables&#xff09;。我们说过&#xff0c;在SQL Server表可以是堆表&#xff08;Heap Table&#xff09;或者聚集表&#xff08;Clustered Table&#xff09;——一个在它上面有聚集索引&#xff08;Clustered Index&#xff09;定义…

广西2021普通高考成绩查询,2021广西高考成绩什么时候出

2021广西高考成绩什么时候出2021-04-22 10:39:21文/叶丹2021广西高考成绩公布时间&#xff1a;预计6月23日。预计6月23日对考生开放高考成绩查询通道&#xff0c;并公布录取最低控制分数线。届时考生可查询高考成绩&#xff0c;请考生密切关注广西招生考试院官网、官方微博、官…

vmware安装中标麒麟高级服务器操作系统 V7.0

vmware安装中标麒麟高级服务器操作系统 V7.0 1、下载中标麒麟高级服务器操作系统 V7.0镜像2、安装中标麒麟高级服务器操作系统 V7.02.1、新建虚拟机2.2、安装虚拟机 3、配置中标麒麟高级服务器操作系统 V7.03.1、登录系统3.2、配置静态IP地址 和 dns3.3、查看磁盘分区3.4、查看…

2021年衢州高考的成绩查询,2021年衢州高考状元是谁分数多少分,历年衢州高考状元名单...

2020年衢州一年一度的高考考试已经结束&#xff0c;今年衢州高考状元是谁呢&#xff0c;衢州高考状元出自哪个高中学校&#xff0c;文理科分数是多少分&#xff0c;一起来了解。一、2020年衢州高考状元名单资料2020年衢州高考状元名单和学校相关信息&#xff0c;截至目前发文时…

计算机主机机箱面板指示灯,电脑主机指示灯不亮了是什么原因

公告&#xff1a; 为响应国家净网行动&#xff0c;部分内容已经删除&#xff0c;感谢读者理解。话题&#xff1a;电脑主机指示灯不亮了是什么原因&#xff1f;回答&#xff1a;是指示灯坏了。或者是主机主板出了问题。参考回答&#xff1a;绿灯不亮是电源问题红灯不亮是硬盘或者…

影响中国历史的十篇政治美文

转载于:https://www.cnblogs.com/yymn/p/4488728.html

什么是计算机网络教学反思,《计算机网络实训之常用的网络工具》教学反思

《计算机网络实训之常用的网络工具》教学反思常用的网络工具是网络管理员必须要掌握好的内容&#xff0c;本实验在学习完相关理论知识的基础上&#xff0c;让学生动手实践&#xff0c;亲自试验常用网络工具的使用。因为直观明了&#xff0c;马上见效&#xff0c;学生有了即时体…

用计算机打字英语单词,常用计算机专业英语词汇-前401-500单词

常用计算机专业英语词汇-前401-500单词贡献者&#xff1a;邓鹏类别&#xff1a;中英混合 时间&#xff1a;2020-10-28 16:48:34 收藏数&#xff1a;2 评分&#xff1a;0返回上页举报此文章请选择举报理由&#xff1a;广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的…

定期定量采购_?采购计划员必备:各种物料采购计划与订单制定的技巧与方法...

采购与供应链全套资料包点击这里领取领取01采购计划管理planl1、制订采购计划的目的采购计划是企业根据市场供求情况、企业的生产经营能力和物料消耗规律等&#xff0c;对计划期内物料和其他物品的采购管理活动所作的预见性安排和部署。采购计划主要是确定采购的数量、时间和方…

angular html清除元素,在Angular js中单击时删除HTML元素

这是我的指示.在身体上显示一个Div.app.directive("autosuggest",function($rootScope) {return {scope: {doneFlag : "",groupFlag : "",inviteesFlag : "",init: &},templateUrl : "title.html",link: function(scope…