免费注册 查看新帖 |

Chinaunix

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

[C] 百度06年的一道笔试题 大家帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-08 20:03 |只看该作者 |倒序浏览
以下多线程对 int 型变量x的操作,哪几个需要进行同步:
A. x=y; B. x++; C. ++x; D. x=1;


希望明白的大虾不但告知答案,最重要的是解释一下这四个选项选或不选的原因!
大家踊跃发言哈

论坛徽章:
0
2 [报告]
发表于 2008-07-08 20:05 |只看该作者
B 两次寄存器操作

论坛徽章:
0
3 [报告]
发表于 2008-07-08 20:06 |只看该作者
我感觉只有B需要。因为需要一个临时变量的操作。
不知道是不是这样。

论坛徽章:
0
4 [报告]
发表于 2008-07-08 20:15 |只看该作者
77h2_eleven

发表于 2008-7-8 20:06
我感觉只有B需要。因为需要一个临时变量的操作。
不知道是不是这样。

在网上找到的对x++的解释:寻找x的地址,然后读取地址中x的值,然后直接将地址中的值加1。
这么说好像没有临时变量吧。


blizzard213

发表于 2008-7-8 20:05
B 两次寄存器操作

如果对变量的操作用到寄存器了就要同步吗?

论坛徽章:
0
5 [报告]
发表于 2008-07-08 20:20 |只看该作者
void p()
{
        int i = 1;
        int j = i++;
}
=================

pushl        %ebp
movl        %esp, %ebp
subl        $8, %esp
movl        $1, -4(%ebp)
movl        -4(%ebp), %edx
leal        -4(%ebp), %eax
=======================  华丽的分割线
incl        (%eax)
movl        %edx, -8(%ebp)

论坛徽章:
0
6 [报告]
发表于 2008-07-08 20:28 |只看该作者
汇编看不大懂啊 能不能以文字的形式从原理上给解释一下呢

论坛徽章:
0
7 [报告]
发表于 2008-07-08 20:33 |只看该作者
原帖由 zeus82 于 2008-7-8 20:28 发表
汇编看不大懂啊 能不能以文字的形式从原理上给解释一下呢


pushl        %ebp
movl        %esp, %ebp
subl        $8, %esp
movl        $1, -4(%ebp)
movl        -4(%ebp), %edx            // 这里是j = i++的第一步(j = i)
leal        -4(%ebp), %eax              // 将i的地址加载到寄存器eax
=======================  华丽的分割线  如果这里不上锁,我改变%eax的值 会出现什么? ls自己想
incl        (%eax)                             // i自增
movl        %edx, -8(%ebp)

不知道我的分析有没道理
我觉得可能会是这样

论坛徽章:
0
8 [报告]
发表于 2008-07-08 20:38 |只看该作者
如果线程切换 不是应该将寄存器中的值保存然后切换回来的时候再恢复以前寄存器中的值吗?如果是这样的话 应该就不会出现同步问题了吗

顺便问一下 该如何引用其他楼的发言啊 我的引用方式好像不对

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2008-07-08 20:41 |只看该作者
movl        -4(%ebp), %edx   // j = i
leal        -4(%ebp), %eax   // 将i的地址放到寄存器eax
=======================  华丽的分割线
incl        (%eax)       // 对eax寄存器中存储的地址对应的值加1,相当于 i+1

[ 本帖最后由 Godbach 于 2008-7-8 20:47 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2008-07-08 20:42 |只看该作者
原帖由 blizzard213 于 2008-7-8 20:20 发表
void p()
{
        int i = 1;
        int j = i++;
}
=================

pushl        %ebp
movl        %esp, %ebp
subl        $8, %esp
movl        $1, -4(%ebp)
movl        -4(%ebp), %edx
leal        -4(%ebp), %eax
=======================  ...



突然觉得,这里用局部变量来解释多线程是不是不大合适?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP