asuka2001
发表于 2011-10-19 18:28
换个坐标系,现在用CPUB的视角。。。现在是读:
C标准现在要求保证读顺序了,两个volatile变量自然先读enable,然后读buffer。
假设的确是从cache里读到了enable然后才去读到buffer,但是如果buffer的值是最新值,但是enable的值没有更新,这编译器又怎么去保证?还是需要加内存屏障???
volatile真的能保证吗?比较怀疑!
cjaizss
发表于 2011-10-19 21:28
换个坐标系,现在用CPUB的视角。。。现在是读:
C标准现在要求保证读顺序了,两个volatile变量自然先读e ...
asuka2001 发表于 2011-10-19 18:28 http://bbs.chinaunix.net/images/common/back.gif
硬件是硬件,cache属于硬件行为,编译器只做的是软件级的东西,只是确认指令上的先后而已.
:::memory照样无法管到cache这一层次.
cjaizss
发表于 2011-10-19 21:34
不用老给我扯 A(); 早说了那个是随手写的; 用新例子:
void* p = malloc();
ptr->buf = p;
ptr-> ...
zylthinking 发表于 2011-10-19 17:02 http://bbs.chinaunix.net/images/common/back.gif
一码归一码,我说
A();
x=1;
不为被编译器变成
x=1;
A();
这样的行为,这与volatile无关,是为了解释你的1楼程序的.
别总拿gcc说事,很多C语言编译器裸机下的编程可就是这么编的.
asuka2001
发表于 2011-10-19 21:53
回复 82# cjaizss
那么volatile只能管理到编译器一级,无法对cache的一致性作出保证,又怎么能保证LZ的代码行为正确呢。
据我所知,锁作为多线程同步的工具,里面加入了内存屏障;如果volatile就可以保证顺序一致,那么为什么还需要加呢?
参见http://www.parallellabs.com/2011/04/09/pthread-mutex-lock-and-thread-safety中的
说简单点,Pthreads线程库帮程序员保证了pthread mutex(spin lock也一样)所保护的临界区内共享变量的可见性:即Thread 1一执行完unlock(),x的最新值1一定能被Thread 2看见。(为了实现这一点,Pthreads线程库在实现的时候都会根据相应的硬件平台调用相应的memory barrier来保证内存可见性,感兴趣的同学可以看看nptl的实现)
这一段,当然作者这段话是否正确我没有能力去证实,如果你质疑的话,就只有去翻nptl的实现了!
zylthinking
发表于 2011-10-19 22:18
本帖最后由 zylthinking 于 2011-10-19 22:44 编辑
一码归一码,我说
A();
x=1;
不为被编译器变成
x=1;
A();
这样的行为,这与 ...
cjaizss 发表于 2011-10-19 21:34 http://bbs.chinaunix.net/images/common/back.gif
你干嘛不说贴子里有很多错字呢, 这种挑刺纯粹就是。。。何况你确定buf赋值一定不乱?和函数调用不乱, 返回值赋值一定不乱吗?返回值赋值是不是一个mov就行的, 是不是在malloc ret后执行的,是不是和enable赋值几乎挨着,为什么一定不乱? 我说没仔细考虑你就以为终于找到说辞可以掩饰你的错误达到各打五十大板目的下台阶了? 你之前抛出volatile论的时候考虑到那是个函数了吗,如你所说函数调用不乱, 那你提volatile不是脱裤子放屁吗? 明知自己错了就是不认,另找战场,耍赖而已
塑料袋
发表于 2011-10-19 22:30
回复 85# zylthinking
你是不是在深圳啊???
zylthinking
发表于 2011-10-19 22:46
不是如果是定当面请教了
塑料袋
发表于 2011-10-19 22:48
咱这两天的讨论中,都没涉及到随机预读。
实际上,预读加进去的话,啥屏障也保证不了读操作按照顺序发生,能够做的只是在屏障之后,验证一下读操作读的数值正确。
这几天我在华为横竖没事干,打算写个文档总结下;要不找个周末,我们一起去东莞,继续我上次想召开,却没开成的常平镇美宝桑拿linux kernel技术研讨会。
zylthinking
发表于 2011-10-19 23:01
周末要带小孩, 我在北京, 实在抽身无术, 如能得资料一读肯定荣兴, 但实在过不去。
cjaizss
发表于 2011-10-20 08:40
回复cjaizss
那么volatile只能管理到编译器一级,无法对cache的一致性作出保证,又怎么能保证LZ的代码 ...
asuka2001 发表于 2011-10-19 21:53 http://bbs.chinaunix.net/images/common/back.gif
另外一个人的帖子我不准备回了.对于你的认为,我希望你分清楚软件行为和硬件行为.编译器不是去干涉CPU的,两码事
页:
1
2
3
4
5
6
7
8
[9]
10
11