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

本文探讨了在现代编译器中,整型变量赋值并非原子操作的可能性。通过举例说明,当两个线程同时对同一整型变量进行自增操作时,可能会出现非预期的结果。这强调了在多线程环境下加锁的必要性,以确保数据一致性。文章最后提到不同类型的锁在并发控制中的应用,并预告下篇将深入讨论锁的类型与选择。
摘要由CSDN通过智能技术生成

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

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.

总结:

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

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

我们下一篇再见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值