免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
81 [报告]
发表于 2011-10-19 18:28 |只看该作者
换个坐标系,现在用CPUB的视角。。。现在是读:

C标准现在要求保证读顺序了,两个volatile变量自然先读enable,然后读buffer。

假设的确是从cache里读到了enable然后才去读到buffer,但是如果buffer的值是最新值,但是enable的值没有更新,这编译器又怎么去保证?还是需要加内存屏障???

volatile真的能保证吗?比较怀疑!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
82 [报告]
发表于 2011-10-19 21:28 |只看该作者
换个坐标系,现在用CPUB的视角。。。现在是读:

C标准现在要求保证读顺序了,两个volatile变量自然先读e ...
asuka2001 发表于 2011-10-19 18:28



    硬件是硬件,cache属于硬件行为,编译器只做的是软件级的东西,只是确认指令上的先后而已.
    :::memory照样无法管到cache这一层次.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
83 [报告]
发表于 2011-10-19 21:34 |只看该作者
不用老给我扯 A(); 早说了那个是随手写的; 用新例子:
void* p = malloc();

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



    一码归一码,我说
  A();
   x=1;
   不为被编译器变成
  x=1;
   A();
   这样的行为,这与volatile无关,是为了解释你的1楼程序的.
   别总拿gcc说事,很多C语言编译器裸机下的编程可就是这么编的.

论坛徽章:
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
84 [报告]
发表于 2011-10-19 21:53 |只看该作者
回复 82# cjaizss

那么volatile只能管理到编译器一级,无法对cache的一致性作出保证,又怎么能保证LZ的代码行为正确呢。

据我所知,锁作为多线程同步的工具,里面加入了内存屏障;如果volatile就可以保证顺序一致,那么为什么还需要加呢?

参见http://www.parallellabs.com/2011 ... k-and-thread-safety中的

说简单点,Pthreads线程库帮程序员保证了pthread mutex(spin lock也一样)所保护的临界区内共享变量的可见性:即Thread 1一执行完unlock(),x的最新值1一定能被Thread 2看见。(为了实现这一点,Pthreads线程库在实现的时候都会根据相应的硬件平台调用相应的memory barrier来保证内存可见性,感兴趣的同学可以看看nptl的实现)


这一段,当然作者这段话是否正确我没有能力去证实,如果你质疑的话,就只有去翻nptl的实现了!

论坛徽章:
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
85 [报告]
发表于 2011-10-19 22:18 |只看该作者
本帖最后由 zylthinking 于 2011-10-19 22:44 编辑
一码归一码,我说
  A();
   x=1;
   不为被编译器变成
  x=1;
   A();
   这样的行为,这与 ...
cjaizss 发表于 2011-10-19 21:34



你干嘛不说贴子里有很多错字呢, 这种挑刺纯粹就是。。。何况你确定buf赋值一定不乱?和函数调用不乱, 返回值赋值一定不乱吗?返回值赋值是不是一个mov就行的, 是不是在malloc ret后执行的,是不是和enable赋值几乎挨着,为什么一定不乱? 我说没仔细考虑你就以为终于找到说辞可以掩饰你的错误达到各打五十大板目的下台阶了? 你之前抛出volatile论的时候考虑到那是个函数了吗,如你所说函数调用不乱, 那你提volatile不是脱裤子放屁吗? 明知自己错了就是不认,另找战场,耍赖而已

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
86 [报告]
发表于 2011-10-19 22:30 |只看该作者
回复 85# 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
87 [报告]
发表于 2011-10-19 22:46 |只看该作者
不是如果是定当面请教了

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
88 [报告]
发表于 2011-10-19 22:48 |只看该作者
咱这两天的讨论中,都没涉及到随机预读。

实际上,预读加进去的话,啥屏障也保证不了读操作按照顺序发生,能够做的只是在屏障之后,验证一下读操作读的数值正确。

这几天我在华为横竖没事干,打算写个文档总结下;要不找个周末,我们一起去东莞,继续我上次想召开,却没开成的常平镇美宝桑拿linux kernel技术研讨会。

论坛徽章:
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
89 [报告]
发表于 2011-10-19 23:01 |只看该作者
周末要带小孩, 我在北京, 实在抽身无术, 如能得资料一读肯定荣兴, 但实在过不去。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
90 [报告]
发表于 2011-10-20 08:40 |只看该作者
回复  cjaizss

那么volatile只能管理到编译器一级,无法对cache的一致性作出保证,又怎么能保证LZ的代码 ...
asuka2001 发表于 2011-10-19 21:53



    另外一个人的帖子我不准备回了.对于你的认为,我希望你分清楚软件行为和硬件行为.编译器不是去干涉CPU的,两码事
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP