多线程编程中整型变量的赋值

整型变量赋值操作不是原子操作

1、给整型变量直接赋值一个常数

如:

int a = 1;

在现代编译器中,往往都会使用优化策略。如果变量a的值在编译期间就可以被计算出来,如下

void test()
{
    int a = 1;
    printf("%d", a);
}

b编译器直接将a由1替代

void test()
{
    printf("%d",1);
}

2、变量自增或自减

如:

a++

 上述指令从汇编角度来看,对应了三条指令

  • 将变量a的值搬运到某个寄存器中
  • 该寄存器中的值自增1
  • 该寄存器中的值搬运回到内存a中
int a = 1;

//线程1
void fun1()
{
    a++;
}

//线程2
void fun2()
{
    a++;
}

现假设有两个线程对a进行自增,得到的结果a的值是多少呢,先思考一下。


其结果为可能为2,也可能为3

我们可以理解a的值为3,但是为什么会是2呢

 在线程1执行到第二步时,eax寄存器的值增加1,恰好线程2执行,此时eax寄存器中的值又被赋予为1,这样得到的结果a的值为2.

总结:

因为整型变量的操作并不是原子操作,所以在多线程编程中,对一个数的赋值操作,往往都会加锁。

而锁又分为很多种,什么时候用什么锁呢

我们下一篇再见

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值