免费注册 查看新帖 |

Chinaunix

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

文思创新的一个面试题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-03-27 22:08 |只看该作者
我想他主要想考i++和++i的区别,i++是先引用后增加,所以不是原子的,++i是先增加后引用,所以是原子的。
...
sbc19861004 发表于 2010-03-26 17:53



这个屁好臭啊!

论坛徽章:
0
32 [报告]
发表于 2010-03-27 23:54 |只看该作者
如果i是全局的,会被两个线程修改的话,即便是在单处理器上,上面的三种写法都不是安全的,因为翻译成汇编的话都不是一条指令就可以完成的。而且i应该定义成voliate int i

论坛徽章:
0
33 [报告]
发表于 2010-03-28 10:34 |只看该作者
回复 31# nuying117


    你这张嘴好臭!
作为自增,++i没必要保留原有值用于其他运算,所以可以直接用INC这条指令实现,不存在load的问题,就是原子的。

“闲时懒读书,用时言左右。看似牛哄哄,其实脸皮厚”

论坛徽章:
0
34 [报告]
发表于 2010-03-28 10:58 |只看该作者
我怎么觉得哪个都不是线程安全的呢?

是否原子操作和线程安全有关系吗?

既然涉及线程,那么肯定 i 是被多个线程共享的,既然如此, 不管是i++, ++i, i=i+1,哪个是安全的?

都需要加锁,既然加锁了,哪个又不是安全的?

莫名其妙的一个题目。

论坛徽章:
0
35 [报告]
发表于 2010-03-28 11:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
36 [报告]
发表于 2010-03-28 12:02 |只看该作者
这个简单啊,看看汇编啦

论坛徽章:
0
37 [报告]
发表于 2010-03-28 19:27 |只看该作者
个人以为i++是不安全的,另外两个是安全的。

论坛徽章:
0
38 [报告]
发表于 2010-03-28 21:58 |只看该作者
这和编译器有关吧,同一编译器的优化配置也会有不同结果

int i;

void add_1()
{
        ++i;
}

void add_2()
{
        i++;
}

void add_3()
{
        i = i + 1;
}

三个函数用GCC编译,在O0即不优化的情况下都编译为:(gcc test.c -S -O0)
movl i, %eax
addl $1, %eax
movl %eax, i
三条指令

而在O1以上都会优化为一条:addl $1, i

中断只会发生在指令之间,所以在单核cpu的情况下能在单条指令下完成的操作都叫原子的,但是多cpu中即使单条指令可以完成的操作也不一定是原子的,因为有的单个指令也可以分解为多个“微操作”如“读-改-写”,所以多i386提供了对总线加锁的手段,看下内核中的atomic_add函数就明白了

static inline void atomic_add(int i, atomic_t *v)
{
        asm volatile(LOCK_PREFIX "addl %1, %0"
                            :: "+m" (v->counter)
                            :: "ir" (i));
}

所以不管怎么样,个人认为在gcc下三个写法是一样的

论坛徽章:
0
39 [报告]
发表于 2010-03-29 09:25 |只看该作者
回复  nuying117


    你这张嘴好臭!
作为自增,++i没必要保留原有值用于其他运算,所以可以直接用I ...
sbc19861004 发表于 2010-03-28 10:34



   
不是所有的CPU都有INC指令的

论坛徽章:
1
2017金鸡报晓
日期:2017-02-08 10:33:21
40 [报告]
发表于 2010-03-29 10:06 |只看该作者
这几个都不是线程安全的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP