免费注册 查看新帖 |

Chinaunix

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

有关内存屏障的问题,头都大了~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-12 17:51 |只看该作者 |倒序浏览
小弟在看LKD2,有关内存屏障mb(),rmb(),wmb()的部分(P122中文版),作者举了个例子:
Thread 1         Thread 2

a = 3;              -

mb();               -

b = 4;              c = b;

-                      rmb();

-                      d = a;

其中a,b初值分别为1,2,书上称执行后c,d值应该是4,3

问题:这两个线程是跑在不同的CPU上的吗?我觉得现代的乱序发射的CPU可以很好地保证指令的执行顺序的啊,这里的的两个线程之间还需要其他同步手段来确保线程一的前两条指令先于线程二执行吗?还是就是用mb();和rmb();来保证同步啊,单CPU需要这种屏障吗?
谢谢

论坛徽章:
0
2 [报告]
发表于 2006-03-13 08:47 |只看该作者
原帖由 通用寄存器 于 2006-3-12 17:51 发表
小弟在看LKD2,有关内存屏障mb(),rmb(),wmb()的部分(P122中文版),作者举了个例子:
Thread 1         Thread 2

a = 3;              -

mb();               -

b = 4;              c = b ...


看看前两天的讨论:

http://bbs.chinaunix.net/viewthr ... &extra=page%3D2

论坛徽章:
0
3 [报告]
发表于 2006-03-13 10:41 |只看该作者
是内存的错错误信息,或内存之内其他问题吧

论坛徽章:
0
4 [报告]
发表于 2006-03-13 10:41 |只看该作者
原帖由 Solaris12 于 2006-3-13 08:47 发表


看看前两天的讨论:

http://bbs.chinaunix.net/viewthr ... &extra=page%3D2


讨论我看了,基本明白了,现在我的问题是这个例子:
Thread 1         Thread 2

a = 3;              -

mb();               -

b = 4;              c = b;

-                      rmb();

-                      d = a;
就算是 c = b;先于d = a;执行,也不能保证c=4啊,线程一对b的赋值是和线程二对c的赋值同时的,还有就是光靠mb和rmb是不能保证线程一先于线程二执行的吧,有可能线程二的d=a;在线程一的a=3;之前就执行了,所以应该需要其他同步手段的吧?谢谢!

论坛徽章:
0
5 [报告]
发表于 2006-03-13 10:43 |只看该作者
原帖由 shidaihulian 于 2006-3-13 10:41 发表
是内存的错错误信息,或内存之内其他问题吧


没懂,什么意思?

论坛徽章:
0
6 [报告]
发表于 2006-03-13 10:44 |只看该作者
昨天给你说的还没明白啊?

论坛徽章:
0
7 [报告]
发表于 2006-03-13 10:46 |只看该作者
原帖由 albcamus 于 2006-3-13 10:44 发表
昨天给你说的还没明白啊?


那个明白了,是说这个例子,我看着觉得例子有问题

论坛徽章:
0
8 [报告]
发表于 2006-03-13 10:48 |只看该作者
原帖由 albcamus 于 2006-3-13 10:44 发表
昨天给你说的还没明白啊?


这个例子对d的赋值可以保证但c的赋值不能保证吧

论坛徽章:
0
9 [报告]
发表于 2006-03-13 11:05 |只看该作者
原帖由 通用寄存器 于 2006-3-13 10:48 发表
这个例子对d的赋值可以保证但c的赋值不能保证吧


有点钻牛角尖了
翻了一下LKD2, 书上没错,再仔细看看, mb究竟是用来做什么的, 不能用来做什么。

spinlock和semaphore这些锁, 其实现都是包含了内存屏障的。

论坛徽章:
0
10 [报告]
发表于 2006-03-13 11:14 |只看该作者
原帖由 albcamus 于 2006-3-13 11:05 发表


有点钻牛角尖了
翻了一下LKD2, 书上没错,再仔细看看, mb究竟是用来做什么的, 不能用来做什么。

spinlock和semaphore这些锁, 其实现都是包含了内存屏障的。


mb是保证a=3先于b=4执行的吧?老大的意思是说b=4是要先于c=b执行的啊?这里应该有一个暗含的自旋锁或是信号量?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP