整型变量赋值操作不是原子操作
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.
总结:
因为整型变量的操作并不是原子操作,所以在多线程编程中,对一个数的赋值操作,往往都会加锁。
而锁又分为很多种,什么时候用什么锁呢
我们下一篇再见