当前位置: 首页 > news >正文

C/C++ Volatile关键词深度剖析

这里 http://hedengcheng.com/?p=725 有对volatile 非常详细的解释,看完之后,心里一惊,因为我刚好在一个项目里用了文中错误示范那种方式来做线程同步,场景如下:

Thread1 对性能要求非常高,它有一些中间数据需要定时同步给数据库,我就增加了一个线程Thread2 来帮它做(Thread2还干了很多其他事情),基本做法是:thread1 干完do_something后,给一个全局的 volatile flag 置1;Thread2在一个大循环里,当检测到flag值是1,则会去读thread1产生的中间数据并入库。

 

按照帖子的说法,flag=true 对应的汇编指令可能被编译器插入到 do_something 对应的指令中间,无法保证do_something做完值才变成1. 根据查找,发现gcc下有一个指令可以强制编译器和CPU 按顺序执行:

 

#define BARRIER() do{ asm volatile("" ::: "memory");}while(0)

 

这样代码变成

 

Thread1()                                           Thread2()

{                    {

  do_something...                                   if(flag==true)

  BARRIER;                                            {

  flag = true;                                              BARRIER;

}                                                                     other thing...

                                                                }

                                                            }

转载于:https://www.cnblogs.com/jiayy/p/volatile.html

相关文章:

  • word2vec原理(一) CBOW与Skip-Gram模型基础——转载自刘建平Pinard
  • Treap实现的名次树
  • 最短路径SPFA算法(邻接表存法)
  • python 读取文件基本格式
  • Spring注入静态变量
  • Hadoop的hdfs api操作
  • 反射获取枚举的属性注释
  • 各种卷积结构原理及优劣总结
  • linux 程序管理
  • mysql 索引使用教程
  • C#操作MongoDB
  • 分页器(自定制)
  • [转]Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
  • springMVC集成activiti-explorer5.22(一)
  • freebsd为网卡设置别名
  • Effective Java 笔记(一)
  • Flannel解读
  • Linux CTF 逆向入门
  • magento2项目上线注意事项
  • maven工程打包jar以及java jar命令的classpath使用
  • Node 版本管理
  • node.js
  • python学习笔记-类对象的信息
  • React组件设计模式(一)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • webpack项目中使用grunt监听文件变动自动打包编译
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • zookeeper系列(七)实战分布式命名服务
  • 程序员最讨厌的9句话,你可有补充?
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 聊聊hikari连接池的leakDetectionThreshold
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 应用生命周期终极 DevOps 工具包
  • MyCAT水平分库
  • 容器镜像
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​520就是要宠粉,你的心头书我买单
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (4) PIVOT 和 UPIVOT 的使用
  • (7)STL算法之交换赋值
  • (a /b)*c的值
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (备忘)Java Map 遍历
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)基于IDEA的JAVA基础12
  • (转)fock函数详解
  • (转)Unity3DUnity3D在android下调试
  • (转)菜鸟学数据库(三)——存储过程
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET 3.0 Framework已经被添加到WindowUpdate