“计算机组织与设计”一书的幻灯片将此代码段显示为获取锁定的示例:
try: addi $t0,$zero,1 #copy locked value
ll $t1,0($s1) #load linked
sc $t0,0($s1) #store conditional
beq $t0,$zero,try #branch if store fails
#<< lock acquired >>
我的理解是ll
指令读取内存位置的初始值,sc
仅在ll
读取的初始值未更改时才存储值。因此,如果内存位置的初始值为1
,意味着锁定已被另一个处理器获取,那么此过程是否只会覆盖该值并假设它以这种方式获取锁定?
答案 0 :(得分:3)
我认为你的代码片段中有一个缺失的分支条件。您应该检查是否已经锁定。
即:
try:
addi $t0,$zero,1 #copy locked value
retry:
ll $t1,0($s1) #load linked
bnez $t1, retry # If lock taken, retry
sc $t0,0($s1) #store conditional
beq $t0,$zero,try #branch if store fails
#<< lock acquired >>