免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zylthinking
打印 上一主题 下一主题

为什么用户空间程序不用考虑内存屏障? [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
71 [报告]
发表于 2011-10-19 16:32 |只看该作者
我的意思是说,有那么一段时间,时序的要求几乎完全靠这个volatile约束
不要把补丁当正统
cjaizss 发表于 2011-10-19 16:16
hui
等你在现代多核 CPU 上代码出 crash 的时候, 再哭诉你的正统去吧

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
72 [报告]
发表于 2011-10-19 16:35 |只看该作者
本帖最后由 cjaizss 于 2011-10-19 16:37 编辑
hui
等你在现代多核 CPU 上代码出 crash 的时候, 再哭诉你的正统去吧
zylthinking 发表于 2011-10-19 16:32



    拜托,世界上不是只有GCC的一个编译器,谢谢
   希望你看懂这句话,不要把补丁当正统.

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
73 [报告]
发表于 2011-10-19 16:43 |只看该作者
拜托,世界上不是只有GCC的一个编译器,谢谢
   希望你看懂这句话,不要把补丁当正统.
cjaizss 发表于 2011-10-19 16:35


靠, 这次再免费指点你一次, 下一次再这样, 直接无视:

1。 去看看 c#, 据我前几天搜索内存屏障时, 发现了它有一个命名为 memorybarrier 的或者类似拼写的函数, 具体没看
2. 去查近几天帖子, 似乎是Ow 提到VC 2005对volatile变量编译出了内存屏障指令, 而之前的没有
3。 查我发给你的链接上的资料, 看正统的C标准对volatile保证什么, 不保证什么

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
74 [报告]
发表于 2011-10-19 16:47 |只看该作者
本帖最后由 cjaizss 于 2011-10-19 16:52 编辑
靠, 这次再免费指点你一次, 下一次再这样, 直接无视:

1。 去看看 c#, 据我前几天搜索内存屏障时 ...
zylthinking 发表于 2011-10-19 16:43



    呵呵,C#我就直接无视了.
   再者,现在CPU这么强大,编译器当然更可以加把劲了,搞出个BUG甚至把本来的认为甚至标准改一改,这是非常正常的事.
   很早之前,编译器就在那里乱序执行了,可为什么到了很靠后才会想到有这样的东西?
       C语言标准里对于volatile的行为的确定义的很含糊,但以前那么多年都这么过去了.
    算了,不说了

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
75 [报告]
发表于 2011-10-19 16:54 |只看该作者
呵呵,C#我就直接无视了.
   再者,现在CPU这么强大,编译器当然更可以加把劲了,搞出个BUG甚至把本 ...
cjaizss 发表于 2011-10-19 16:47


这句话就有意思了, 我不得不回:
你说了半天, 坚持的是哪里的正统?
论事实, GCC 与 VC 都不保证 volatile 编译出内存屏障指令
论标准, C标准也没有支持 volatile 编译出内存屏障(不知道最新版本有没有这个规定)

你的坚持就是,  GCC等是有bug的, C标准是可以改的---似乎唯独你说什么对什么就对似的

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
76 [报告]
发表于 2011-10-19 17:00 |只看该作者
这句话就有意思了, 我不得不回:
你说了半天, 坚持的是哪里的正统?
论事实, GCC 与 VC 都不保证  ...
zylthinking 发表于 2011-10-19 16:54



    那我就说一下吧
   A();
     x=1;
   不会被编译成
   x=1;
   A();
  
在很长的时间里,volatile只好按顺序执行,虽没写入标准,但实际上就是这么干的.
但现在编译器越做越复杂,只好在这上面来抠,另外出BUG的几率也是存在的

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
77 [报告]
发表于 2011-10-19 17:02 |只看该作者
本帖最后由 zylthinking 于 2011-10-19 17:06 编辑
那我就说一下吧
   A();
     x=1;
   不会被编译成
   x=1;
   A();
  
在很长的时间里, ...
cjaizss 发表于 2011-10-19 17:00


不用老给我扯 A(); 早说了那个是随手写的; 用新例子:
void* p = malloc();

ptr->buf = p;
ptr->enable = true;


你可以将 buf 或 enable, 或 两者都定义成 volatile; 然后你整体我给解释一下, 如果在 alpha, arms 多核下, 为什么

if(ptr->enable){
    memcpy(ptr->buf,...)
}
一定不崩溃

论坛徽章:
0
78 [报告]
发表于 2011-10-19 17:25 |只看该作者
不用老给我扯 A(); 早说了那个是随手写的; 用新例子:
void* p = malloc();

ptr->buf = p;
ptr-> ...
zylthinking 发表于 2011-10-19 17:02



    你可以将 buf 或 enable, 或 两者都定义成 volatile; 然后你整体我给解释一下, 如果在 alpha, arms 多核下, 为什么

if(ptr->enable){
    memcpy(ptr->buf,...)
}
一定不崩溃

你对别人要求太高,对自己要求太低了
你没遇到过是因为:
对buf 和enable的写操作,编译器没有必要故意先写enable,否则你悲剧了,编译器必要时是可以乱序的,这就是barrier()的作用
ptr->buf = p;
barrier();
ptr->enable = 1; preempt_enable就是类似这么做
就算这样(编译器按顺序生成了两条写指令),如果你的if(ptr->enable)是在另一个CPU上进行的如果发生写乱序,那你也悲剧了,所以这时候需要_锁_

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
79 [报告]
发表于 2011-10-19 17:28 |只看该作者
本帖最后由 zylthinking 于 2011-10-19 17:32 编辑
你可以将 buf 或 enable, 或 两者都定义成 volatile; 然后你整体我给解释一下, 如果在 alpha, a ...
linux_next 发表于 2011-10-19 17:25


你这位兄弟看帖子看反了吧, 你应该对他解释而不是我。
帖子的问题是我提出的没错, 但这几天我自己也查资料, 也向人请教, 基本明白是我错了; 然后碰到这位, 说volatile就行了, 我一个劲儿对他说他的理解是错的, 还给了他个链接。 上面最顶儿上的20行内应该就有明确的叙述, 说明volatile不行, 这哥们过了一夜, 又找到这里继续纠缠, 要谁谁不闹火???
另外, 请问我怎么对别人要求高对自己低了???

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
80 [报告]
发表于 2011-10-19 18:20 |只看该作者
本帖最后由 asuka2001 于 2011-10-19 18:36 编辑

假设enable与buffer都是volatile,两个volatile变量的写顺序,C标准要求保证!

那么编译器能保证到哪一步呢?是保证两个写往 load / store queue里放一定是顺序的,还是能保证从load / store queue里出来,进入cache里是顺序的?

如果要保证进入cache里是顺序的,这怎么保证???

编译器可以要求CPU的load / store queue顺序出么?还是说没有办法,加内存屏障?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP