浅谈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亿潜在用户。随着…

CAEmitterLayer 和 CAEmitterCell 粒子发射

CAEmitterLayer emitterCells&#xff1a;CAEmitterCell对象的数组&#xff0c;被用于把粒子投放到layer上 birthRate:可以通俗的理解为发射源的个数&#xff0c;默认1.0。当前每秒产生的真实粒子数为CAEmitterLayer的birthRate*子粒子的birthRate&#xff1b; lifetime emitte…

android 音量调节 seekbar,Android 使用SeekBar调节系统音量

以下是一个使用SeekBar来调节系统音量的实例&#xff1a;1、XML&#xff1a;android:id"id/sound"android:layout_width"150px"android:layout_height"10px"android:max"100"//设置拖动条最大值android:progress"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; // <…

html语言文本框的符号,HTML中的文本框textarea标签

用来创建一个可以输入多行的文本框&#xff0c;此标志对用于标志对之间。具有以下属性&#xff1a;(1)onchange指定控件改变时要调用的函数(2)onfocus当控件接受焦点时要执行的函数(3)onblur当控件失去焦点时要执行的函数(4)onselect当控件内容被选中时要执行的函数(5)name这文…

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;而微信上的一些订单、预约、登记、投诉、反馈等功能都可以使用微信万能表单来实现&#xff0c;那么微信万能表单怎么做&#xff1f;下文带来微信公众号表单制作方法&#xff0c;方法很简单&#xff0c;需要的朋友一起看看吧。微信万能表…

GridView控件RowDataBound事件中获取列字段值的几种途径

前台&#xff1a; <asp:TemplateField HeaderText"充值总额|账号余额"><ItemTemplate><asp:Label ID"lblSurplusMoney" runat"server" Text""></asp:Label></ItemTemplate></asp:TemplateField> …

html复选框值改变后事件,javascript – 从onclick/onchange事件获取HTML值的复选框

简短的回答&#xff1a;使用点击事件&#xff0c;它不会触发&#xff0c;直到更新的值&#xff0c;并触发时&#xff0c;你希望它&#xff1a;Checkboxfunction handleClick(cb) {display("Clicked, new value " cb.checked);}更长的答案&#xff1a;更改事件处理程…

BZOJ-2194 快速傅立叶之二

FFT模版题。 观察题目&#xff0c;我们可以发现&#xff0c;只要把序列b倒过来&#xff0c;再联想一下乘法运算。。。 我们会发现&#xff0c;将序列a和序列b当作100进制数&#xff0c;做一次乘法&#xff0c;然后从低到高每一位便是答案了&#xff08;乘完无需进位&#xff09…

Python:IndentationError: unexpected indent

python遇到错误&#xff1a;IndentationError: unexpected indent解决办法&#xff1a;python因为是根据格式缩进来识别逻辑块的&#xff0c;所以对格式要求极为严格&#xff0c;出现上述错误&#xff0c;一般都是tab和空格没有对齐。检查了一下&#xff0c;的确编辑器上多出来…

Mvc 学习笔记(一)

1. MVC 表示 模型-视图-控制器。MVC是一种用于开发应用程序的模式&#xff0c;具备良好的架构&#xff0c;可测试和易于维护。基于MVC应用程序中包含&#xff1a; Models&#xff1a;表示应用程序的数据&#xff0c;并使用验证逻辑强制执行业务规则的数据的类。 Views&#xff…

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;定义…

index.html乱码问题,用apache打开文件index显示乱码为什么

用apache打开文件index显示乱码怎么回事这不是 apache 的问题。是 php 本身编码&#xff0c;或者 数据库编码问题。---------------------------给你看一篇别人的问题------------------------让人烦恼的 PHP UTF8 乱码解决方案088月2009一般来说&#xff0c;如果将 各个文件类…

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

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