上下文切换恢复任务时是否保留变量值?无同步多线程场景问询
问题解答
结论
最终全局变量count的值会是1。
原因分析
首先要明确:count = count + 1不是原子操作,它会被拆分为三个独立的CPU指令步骤:
- 从内存中读取
count的当前值,加载到CPU的某个寄存器中 - 将寄存器中的值加1
- 将寄存器的计算结果写回内存,更新
count的值
结合场景一步步拆解:
- 线程1执行第一步:从内存读取
count(初始值为0)到寄存器,此时发生上下文切换。 - 上下文切换时,操作系统会保存线程1当前的CPU寄存器状态(包括那个存了0的寄存器),然后切换到线程2执行。
- 线程2完整执行三个步骤:读取内存的0→加1成1→写回内存,此时内存中的
count已经变成1。 - 切换回线程1时,操作系统会恢复线程1之前保存的寄存器状态——也就是那个存着0的寄存器依然保留着旧值。线程1继续执行剩下的两步:寄存器的0加1变成1→写回内存,直接覆盖了线程2写入的1,所以最终
count的值是1。
关于上下文切换的变量保留问题
要区分两种“变量”的状态:
- 内存中的全局变量:是所有线程共享的,上下文切换不会保留它的旧值,线程对它的修改会直接反映到内存中,其他线程后续读取会拿到最新值。
- 线程私有CPU寄存器中的值:上下文切换时,操作系统会完整保存当前线程的寄存器状态,恢复线程时会原样加载这些状态,所以线程之前加载到寄存器里的旧值会被保留,线程恢复后会基于这个旧值继续执行,这也是导致上述场景中最终结果为1的核心原因。
内容的提问来源于stack exchange,提问作者user19481364
相关产品推荐
相关产品推荐

