免费注册 查看新帖 |

Chinaunix

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

[C] 多线程中volatile的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-18 17:43 |只看该作者 |倒序浏览
假设单核,应用层代码,也就是说不会有中断去操作一个变量,那么即使多线程,我觉得不用volatile这个变量也是安全的把?
volatile应该是寄存器和内存间的关系,应该和cache没啥关系把?
现在写一个多线程的代码,不知道需不需要加volatile给一些全局量,并且不清楚如果加了性能会有多少损失。

论坛徽章:
0
2 [报告]
发表于 2010-11-18 17:51 |只看该作者
多线程该同步的地方还是得同步,volatile帮不了你的

论坛徽章:
0
3 [报告]
发表于 2010-11-18 17:55 |只看该作者
volatile应该只能决定是从寄存器还是内存里面读 至于读内存的时候有没有经过cache是这个限定符无法决定的。取决于这个页面是否能cache,地址有没有命中。

论坛徽章:
0
4 [报告]
发表于 2010-11-18 17:57 |只看该作者
哦 一时糊涂 ,应该是需要volatile的,使得其无法被加载到寄存器中,即使是单核,寄存器内容切换回来还是会出问题。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
5 [报告]
发表于 2010-11-18 21:09 |只看该作者
volatile是防止编译器优化对内存变量生成一个寄存器备份
全局变量按道理说应该不会被优化成是volatile的.因为信号处理函数是异步执行的.那么所有的全局变量都有被访问的可能性.那得全部加上volatile了

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
6 [报告]
发表于 2010-11-18 21:20 |只看该作者
如果对齐了,如果原子操作了,如果是单cpu了,那么不需要加锁,不需要volatile
如果对齐了,如果不原子操作了,如果单cpu了,那么需要volatile
如果没对齐了,如果原子操作了,如果单cpu了,那么应该不可能存在这种情况
如果没有对齐了,如果没有原子操作了,如果单cpu了,那么加锁
如果对齐了,如果原子操作了,如果多cpu了,如果volatile了,那么可能加锁
如果没对齐,如果没有原子操作了,如果多cpu了,那么一定加锁
如果没对齐,如果没有原子操作了,如果多cpu了,如果没volatile了,那么可能加锁
如果。。。如果。。。

个人看法,不要全信!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP