多线程操作共享资源(如全局变量)原理

发布时间 2023-03-26 10:55:42作者: 踏浪而来的人

CPU对变量的计算分为三个步骤:

  1. 从内存读取变量到寄存器(如add寄存器)

  2. 将读取到的变量进行计算

  3. 将寄存器中计算的值写入内存

 

如有两个线程(线程1和线程2)对共享资源(全局变量)a=0进行自增操作(a++),可能出现如下情况:

  线程1进行a++时,会将变量a读取寄存器,在对变量a进行计算的时候,cpu分配给线程1的时间片到了,这时线程1将阻塞,a = 0,cpu会将变量的值和状态等存起来(供其再次获得时间片使用);

  这时线程2将运行,cpu给线程2的时间片足够将a++操作执行完(即从内存读取变量到寄存器、将变量加1、再将1写入到a的地址中),现在a=1,线程2结束;

  这时线程1有获得时间片,从阻塞的地方继续执行(即将变量a加1、再将1写入a的地址),这样原先a = 1被线程1重新赋值为1