免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-14 10:12 |只看该作者 |倒序浏览
看完http://bbs.chinaunix.net/redirec ... 45&ptid=2054255这个回复, 终于对内存屏障有了一个初步了解了;
现在的一个问题是, 为什么用户空间的程序不需要考虑内存屏障问题呢?
比如在多线程背景下:

线程A

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

线程B:

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

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

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-10-14 10:35 |只看该作者
应该跟编译器有关吧。
编译器要是这么乱优化,肯定要出问题了

论坛徽章:
0
3 [报告]
发表于 2011-10-14 11:10 |只看该作者
回复 1# zylthinking


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

论坛徽章:
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
4 [报告]
发表于 2011-10-14 11:20 |只看该作者
回复  zylthinking


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


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

论坛徽章:
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
5 [报告]
发表于 2011-10-14 11:27 |只看该作者
回复 1# zylthinking

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

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


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

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

论坛徽章:
0
6 [报告]
发表于 2011-10-14 11:37 |只看该作者
回复 4# zylthinking


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

论坛徽章:
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
7 [报告]
发表于 2011-10-14 11:47 |只看该作者
本帖最后由 zylthinking 于 2011-10-14 11:51 编辑
回复  zylthinking


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



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

论坛徽章:
0
8 [报告]
发表于 2011-10-14 11:49 |只看该作者
如果不考虑乱序(用户空间程序几乎没有会考虑这个的), 你能说这代码会出问题???
zylthinking 发表于 2011-10-14 11:20


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

论坛徽章:
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
9 [报告]
发表于 2011-10-14 11:54 |只看该作者
1. user space的程序一般用lock来保证正确性。
2. 如果你想用lock,想写lockless的code,那么你必须自 ...
eexplorer 发表于 2011-10-14 11:49


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

论坛徽章:
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
10 [报告]
发表于 2011-10-14 11:58 |只看该作者
1. user space的程序一般用lock来保证正确性。
2. 如果你想用lock,想写lockless的code,那么你必须自 ...
eexplorer 发表于 2011-10-14 11:49


照你这么说, 现存的程序很有可能非常多的存在因乱序执行而导致的各种bug隐藏着, 这个也和无锁算法没有任何鸟关系, 就算没有无锁算法概念的应用程序程序员, 就他自己对多线程的理解, 也不会加任何锁的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP