zylthinking 发表于 2011-10-14 10:12

为什么用户空间程序不用考虑内存屏障?

看完http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=14468045&ptid=2054255这个回复, 终于对内存屏障有了一个初步了解了;
现在的一个问题是, 为什么用户空间的程序不需要考虑内存屏障问题呢?
比如在多线程背景下:

线程A

ptr->buffrt = malloc(xxx);
ptr->enable = true;

线程B:

if(ptr->enable){
    memcpy(ptr->buffer, ...);
}

那么如果线程A乱序执行, 先 enable =true 后又发生线程切换到B, 岂不是挂了???

amarant 发表于 2011-10-14 10:35

应该跟编译器有关吧。
编译器要是这么乱优化,肯定要出问题了

eexplorer 发表于 2011-10-14 11:10

回复 1# zylthinking


    你这个情况是程序写的不对,正确的程序应该用pthread_mutex保护以防止你说的这种情况。
    只有thread A release pthread_mutex后,thread B才可以访问这些数据。unlock操作是一个memory barrier,保证thread B在拿到锁后才能访问到A改动的数据。

zylthinking 发表于 2011-10-14 11:20

回复zylthinking


    你这个情况是程序写的不对,正确的程序应该用pthread_mutex保护以防止你说的这 ...
eexplorer 发表于 2011-10-14 11:10 http://bbs.chinaunix.net/images/common/back.gif

如果不考虑乱序(用户空间程序几乎没有会考虑这个的), 你能说这代码会出问题???

asuka2001 发表于 2011-10-14 11:27

回复 1# zylthinking

我猜想是不是进程切换中操作系统进行了顺序性保障?这个也许需要看看源代码。

如果是两个CPU分别在执行,我猜应该跟塑料袋提到的关于顺序模型有关:
基本原理概括为两句话:
1) CPU2若看到CPU1执行了某条指令,则必可看到CPU1中这条指令之前的所有指令。
2) CPU3若看到CPU2执行了某条指令,而此时CPU2若看到CPU1执行了某条指令,则CPU3必可看到CPU1中的这条指令。该原则递归。

因为CPU2看到了ptr->enable = true;这条指令。

都是个人猜测,还请大家指点。。。

kouu 发表于 2011-10-14 11:37

回复 4# zylthinking


    我觉得这个代码是有问题的。但是不是在每个体系结构下都会出问题,X86貌似就不会。

zylthinking 发表于 2011-10-14 11:47

本帖最后由 zylthinking 于 2011-10-14 11:51 编辑

回复zylthinking


    我觉得这个代码是有问题的。但是不是在每个体系结构下都会出问题,X86貌似就不 ...
kouu 发表于 2011-10-14 11:37 http://bbs.chinaunix.net/images/common/back.gif


x86 肯定不会, 但我想知道的是其他平台会不会, 因为现在就我所知, 几乎没有用户空间程序员会对这个概念有理解, 也没有哪个平台在其API中包含了内存屏障这样的手段; 如果都要求应用程序程序员自己写汇编自己做内存屏障, 我自己都不信;
所以, 我现在倾向于相信用户空间的程序肯定可以做到不考虑这玩艺照样不出问题, 但只是猜测操作系统可能会在切换上下文时顺手来这么一个内存屏障, 但尚没有读源码, 还不确定一定是操作系统帮你做了

eexplorer 发表于 2011-10-14 11:49

如果不考虑乱序(用户空间程序几乎没有会考虑这个的), 你能说这代码会出问题???
zylthinking 发表于 2011-10-14 11:20 http://bbs.chinaunix.net/images/common/back.gif

1. user space的程序一般用lock来保证正确性。
2. 如果你想用lock,想写lockless的code,那么你必须自己考虑memory order issue,因为c语言并没有定义memory order的东东。我好像记得看到有人在往c++里添memory order的东西,想从语言上来定义memory order语义,这样程序员就不用搞清楚每个arch的硬件上定义的memory order指令了。

zylthinking 发表于 2011-10-14 11:54

1. user space的程序一般用lock来保证正确性。
2. 如果你想用lock,想写lockless的code,那么你必须自 ...
eexplorer 发表于 2011-10-14 11:49 http://bbs.chinaunix.net/images/common/back.gif

怎么总是锁来锁去的, 我还不知道线程同步一般都是用锁???
问题是用户空间程序线程同步, 一般没有人考虑乱序, 甚至没有乱序概念, 多线程编程一般也只是有变量并发冲突, 我之前贴出的代码你哪里看到并发冲突了???

zylthinking 发表于 2011-10-14 11:58

1. user space的程序一般用lock来保证正确性。
2. 如果你想用lock,想写lockless的code,那么你必须自 ...
eexplorer 发表于 2011-10-14 11:49 http://bbs.chinaunix.net/images/common/back.gif

照你这么说, 现存的程序很有可能非常多的存在因乱序执行而导致的各种bug隐藏着, 这个也和无锁算法没有任何鸟关系, 就算没有无锁算法概念的应用程序程序员, 就他自己对多线程的理解, 也不会加任何锁的
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 为什么用户空间程序不用考虑内存屏障?