面试题【1】:i++是否原子操作?并解释为什么?
来源:互联网 发布:什么软件属于系统软件 编辑:程序博客网 时间:2024/05/29 02:15
不是原子操作。理由:
1.i++分为三个阶段:
内存到寄存器
寄存器自增
写回内存
这三个阶段中间都可以被中断分离开.
2.++i首先要看编译器是怎么编译的,
某些编译器比如VC在非优化版本中会编译为以下汇编代码:
__asm
{
moveax, dword ptr[i]
inc eax
mov dwordptr[i], eax
}
这种情况下,必定不是原子操作,不加锁互斥是不行的。
假设加了优化参数,那么是否一定会编译为“inc dword ptr[i]”呢?答案是否定的,这要看编译器心情,如果++i的结果还要被使用的话,那么一定不会被编译为“inc dword ptr[i]”的形式。
那么假设如果编译成了“inc dword ptr[i]”,这是原子操作,是否就不需要加锁了呢?如果在单核机器上,不加锁不会有问题,但到了多核机器上,这个不加锁同样会带来严重后果,两个CPU可以同时执行inc指令,但是两个执行以后,却可能出现只自加了一次。
真正可以确保不“额外”加锁的汇编指令是“lock inc dword ptr[i]”,lock前缀可以暂时锁住总线,这时候其他CPU是无法访问相应数据的。但是目前没有任何一个编译器会将++int编译为这种形式。
0 0
- 面试题【1】:i++是否原子操作?并解释为什么?
- 面试题【1】:i++是否原子操作?并解释为什么?
- 面试题【1】:i++是否原子操作?并解释为什么?
- i++是否原子操作?并解释为什么???????
- i++是否原子操作?并解释为什么?
- i++是否原子操作?并解释为什么?
- i++是否原子操作?并解释为什么?
- i++是否是原子操作?
- i++和++i是否为原子操作
- i++递增操作是否具有原子性
- i++ 是否为原子操作 和 Java中的volatile关键字
- i++不是原子操作
- i++ 不是原子操作
- i++是原子操作吗
- i++是原子操作吗?怎么保证其原子性
- C++面试题之i++面试题
- 3.11 文件I/O_原子操作
- Java i++是原子操作的假象
- sap 判断字串是不是为数字
- php框架一些错误
- 192 - Word Frequency
- weblogic停止服务
- 关于状态栏的隐藏与颜色设置
- 面试题【1】:i++是否原子操作?并解释为什么?
- 目前网络时间服务有哪几种协议?
- 最全的前端资源导航
- UILable的换行
- 在Android中java与js互调的demo
- linux启动apache命令报错(98)Address already in use: make_sock: could not bind to addres
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- RHEL 6.4(i386)安装基于fcitx的搜狗拼音输入法
- leetcode-1:Two Sum