带锁的 MIPS 同步
MIPS Synchronization with locks
"Computer Organization and Design" 书的幻灯片将此代码片段显示为获取锁的示例:
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
意味着锁已被另一个处理器获取,那么这个过程是否会简单地覆盖该值并假设它以这种方式获取了锁?
我认为您的代码段中缺少条件分支。你应该检查锁是否已经被占用。
即:
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 >>
"Computer Organization and Design" 书的幻灯片将此代码片段显示为获取锁的示例:
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
意味着锁已被另一个处理器获取,那么这个过程是否会简单地覆盖该值并假设它以这种方式获取了锁?
我认为您的代码段中缺少条件分支。你应该检查锁是否已经被占用。
即:
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 >>