免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: zeus82
打印 上一主题 下一主题

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

论坛徽章:
0
41 [报告]
发表于 2008-07-11 09:44 |只看该作者
都是2楼的回复给害的,害得大家误入歧途。

论坛徽章:
0
42 [报告]
发表于 2008-07-11 16:39 |只看该作者
自增自减都有原语操作的API

论坛徽章:
0
43 [报告]
发表于 2008-07-19 13:40 |只看该作者
多线程纯粹是一个软件概念,千万别跟硬件扯上关系

我的观点是,多线程对于全局变量的操作尽可能的加上同步互斥,理由有
1.从跨平来看,确实不确定CPU是否支持这类操作为原子操作,代码可移植性好
2.就效率而言,假设编译器往聪明方向发展,那么它会合理的优化掉不必要的加锁

论坛徽章:
0
44 [报告]
发表于 2008-07-19 13:44 |只看该作者
原帖由 freeray 于 2008-7-19 13:40 发表
多线程纯粹是一个软件概念,千万别跟硬件扯上关系

我的观点是,多线程对于全局变量的操作尽可能的加上同步互斥,理由有
1.从跨平来看,确实不确定CPU是否支持这类操作为原子操作,代码可移植性好
2.就效率 ...


其实硬件也有多线程的概念 :)

论坛徽章:
0
45 [报告]
发表于 2008-07-19 16:53 |只看该作者

论坛徽章:
0
46 [报告]
发表于 2008-07-19 22:27 |只看该作者
我觉得ABC都要。

转化成汇编语句后,只有对立即数的赋值 步骤只有一个。

论坛徽章:
0
47 [报告]
发表于 2008-07-20 00:49 |只看该作者
是A.
下面是汇编代码.
其中A是把y的内容放到一个寄存器里,之后又把寄存器的内容放到x里.
在这之间,y的值可能会被改变,比如有两个线程,有如下代码:
x=y;
____________
x=z;
____________
我们不能指望,x=y执行后,x和y的值是相等的,所以,并非安全.

而其它的选项,都是安全的.
问题是: x++和++x是否安全,
而不是y=x++或y=++x是否安全,
y=x++和y=++x都不是安全的,但x++和++x本身都是安全的.


void test1()
{
        int x=23;
        int y;

        y=x;
}
       


void test2()
{
        int x=23;
        int y;

        x++;
}

void test3()
{
        int x=23;
        int y;
       
        ++x;
}

void test4()
{

        int x=23;
        int y;

        x=1;
}



_test1:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        movl        $23, -4(%ebp)
       
        movl        -4(%ebp), %eax
        movl        %eax, -8(%ebp)
       
        leave
        ret
.globl _test2
        .def        _test2;        .scl        2;        .type        32;        .endef
_test2:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        movl        $23, -4(%ebp)
       
        leal        -4(%ebp), %eax
        incl        (%eax)
       
        leave
        ret
.globl _test3
        .def        _test3;        .scl        2;        .type        32;        .endef
_test3:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        movl        $23, -4(%ebp)
       
        leal        -4(%ebp), %eax
        incl        (%eax)
       
        leave
        ret
.globl _test4
        .def        _test4;        .scl        2;        .type        32;        .endef
_test4:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        movl        $23, -4(%ebp)
       
        movl        $1, -4(%ebp)
       
        leave
        ret
        .def        ___main;        .scl        2;        .type        32;        .endef
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP