i++不是原子操作

汇编指令中:

   在32位系统中,且i没有跨页,那么i++是原子的。其指令格式如下:

      movl x, %eax

      addl $1, %eax

      movl %eax, x

   在64位系统中,i++无论如何也不是原子操作。其指令代码如下:

      movl x, %eax

      movl x+4, %edx

      addl $1, %eax

      adcl $0, %edx

      movl %eax, x

      movl %edx, x+4

   但是,在高级程序语言中,如java与C++等,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。

   之前我以为只要加上volatile修饰符就可以使i++操作编程原子性,但事实不是这样的。

   加上volatile只是在编译器优化时,提示每次都从内存中读取i的值。可是当两个线程进行操作时,仍然会出现重复写会的操作。(这句是我的猜测,因为我写的多线程程序会出现两次i++后结果一样的情况)

   因此,最安全的方法是将i++放入加锁的方法块中。这样就可以保证安全的访问量。例(对于java): synchronized method(){i++;}

   以上是一些心得,不正确的地方敬请指正,希望对大家有帮助。


http://www.cppblog.com/elva/archive/2011/01/21/139019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值