You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Test&Set原子性及锁获取场景死循环的疑问确认

关于Test&Set锁机制的疑问解答

问题场景判断

假设线程A持有锁,线程B尝试获取锁,若执行以下非原子的指令序列:

// 非原子的Test&Set模拟
r = M[addr]; // 线程B读取锁变量到寄存器
M[addr] = 0; // 线程A释放锁(将锁设为0)
M[addr] = 1; // 线程B将锁变量覆写为1

你的判断是正确的。

原因是:线程B读取到的锁变量值是线程A持有锁时的1,随后线程A释放锁把锁设为0,但线程B的后续指令会直接把锁覆写回1。此时锁变量被错误设为1,而线程B因读取的初始值是1,会认为自己没获取到锁,继续循环尝试,但实际上锁已经被它自己改成了1,最终会陷入无限循环。

原子Test&Set的观点验证

你认为“如果Test&Set是原子指令,这种情况就不会发生,因为两条指令之间不会有其他指令介入”的观点完全正确。

原子Test&Set的核心是将“读取锁变量值”和“设置锁变量为1”绑定为不可分割的原子操作,执行过程中其他线程的指令无法插入。线程B执行原子Test&Set时,要么完整读取当前锁值并设置为1,要么被其他线程的原子操作打断后重试,不会出现中间被线程A修改锁变量的情况。

当线程A持有锁时,线程B执行原子Test&Set会读取到1,获取锁失败;当线程A释放锁(锁设为0)后,线程B执行原子Test&Set会读取到0并原子性将锁设为1,成功获取锁,不会出现覆写锁导致的死循环问题。


内容的提问来源于stack exchange,提问作者Gwanho Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:05:00