免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2485 | 回复: 4
打印 上一主题 下一主题

问一个编译器问题,求编译大虾解惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-07 16:39 |只看该作者 |倒序浏览
本帖最后由 fuping0726 于 2012-12-07 17:24 编辑

最近编写多线程代码,有个疑惑:全局变量会被优化到寄存器中吗(O3优化级别)?如果会,则全局变量在不加锁访问时必须要加volatile(锁一般都自带内存屏障);但如果全局变量不会被优化到寄存器中,则volatile在多线程中基本失去意义,唯一用途就剩访问外设寄存器了;网上找不到比较权威的资料(网上的都是一些个人见解,有的人甚至把volatile和cache一致性混淆),比如有的资料说存在全局寄存器变量,有的资料则相反(论据是信号,信号都是异步执行的,而信号中会访问全局变量,如果全局变量被放到寄存器中,则所有的全局变量都必须加volatile,和现实不符合;而且貌似有的编译器禁止register 修饰全局变量)。

求编译器高手解惑!最好是研究过gcc编译器的,谢谢了

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
2 [报告]
发表于 2012-12-07 18:37 |只看该作者
问题很复杂,我的理解是:

全局变量会被优化到寄存器。

对于单核处理器,处理器如果可以原子(注1)访问一个全局变量,那么,用volatile可以保证程序正常运行;
可以说成:volatile本身可以保证高级语言到机器指令之间的顺序性,而单核处理器本身就维护了机器指令执行的顺序性。

volatile在多核处理器中,实际上失去了“程序员所期待的意义”,
VS 2005之后的版本,Java数据模型将这个关键字与内存屏障捆绑,也是希望将语义回归“程序员的期望”

volatile作为语言的关键字,仅与编译器相关,跟硬件没有关系(如果引入了mb指令,也只是指令层面)。

如果程序和异步信号都需要读-更改-写全局变量,则只能用原子指令,如果异步信号写,应用程序查询读,则不需要。

注1:这里用原子并不合适,非常微妙,不好描述,试想一下如果一个longlong类型在32bit处理器上,是无法通过一条指令完成读写操作,同样对于不对齐数据,
        一些体系结构也需要多条指令完成访问;

论坛徽章:
0
3 [报告]
发表于 2012-12-07 19:04 |只看该作者
对,vloatile是给编译器看的,和硬件无关,其实多线程中全局变量的访问既要保证原子性,还可能对顺序性有要求(防止编译器乱序和cpu乱序,volatile两者都不保证),但有些情况下用简单全局变量如int存一个状态值作多线程同步应该是可以的,我想问的是这样的全局变量会被优化到寄存器吗?如果否的话代码就能写得好看一点,我不想在代码中加volatile相关的东西,有些结构嵌套的话要加很多

论坛徽章:
0
4 [报告]
发表于 2012-12-07 19:06 |只看该作者
其实可以不扯volatile了,免得问题扩大化,最根本的问题:编译器是否保证全局变量每次都从内存中存取?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11数据库技术版块每日发帖之星
日期:2015-08-30 06:20:00
5 [报告]
发表于 2012-12-07 21:28 |只看该作者
fuping0726 发表于 2012-12-07 19:06
其实可以不扯volatile了,免得问题扩大化,最根本的问题:编译器是否保证全局变量每次都从内存中存取?


不能。问题的根源在 C/C++ 语言本身是假定单线程模型的。这个需要c++语言从标准上解决这个问题。

现在只能第一使用 volatile 确保编译器禁止寄存器优化。第二使用 barrier 保证执行次序。两者要同时使用才可以。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP