多线程读取全局变量 (在无锁状态下 会造成多少种值的出现)

本文探讨了在C++环境中,全局变量在多线程中进行非原子加减操作时可能出现的问题。通过示例展示了在特定情况下,全局变量的值如何从5变为4,揭示了非原子操作可能导致的结果不一致性和数据竞争。总结得出,全局变量的值可能在-10到10之间变化,而非预期的保持不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int global = 0;

// thread 1
for(int i = 0; i < 10; ++i)
global -= 1;

// thread 2
for(int i = 0; i < 10; ++i)
global += 1;
之后global的可能的值是多少(多种可能)?

 

  这个问题考虑的是全局变量global的加减操作不是原子操作,在加减过程中有可能被打断,从而产生的结果与预期不一样。上述global加减操作的汇编如下

;windows下加操作
mov eax,dword ptr [globle (10A9148h)] 
add eax,1 
mov dword ptr [globle (10A9148h)],eax 

;windows下减操作
mov eax,dword ptr [globle (10A9148h)] 
sub eax,1 
mov dword ptr [globle (10A9148h)],eax 

;linux下加操作
movl global, %eax
addl $1, %eax
movl %eax, global

;linux下减操作
movl global, %eax
subl $1, %eax
movl %eax, global

可见,不论加减都要经过global的值加载到eax,然后eax加减1,最后再写回global中。这时如果线程1的global的值刚加载到eax中,线程2获取到了执行权,就会出现问题。具体看下面例子。

  假设操作前global值为5。

  线程1                                                   &nb

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值