锁定

时间:2015-10-23 15:58:04

标签: synchronization locking mips

“计算机组织与设计”一书的幻灯片将此代码段显示为获取锁定的示例:

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,意味着锁定已被另一个处理器获取,那么此过程是否只会覆盖该值并假设它以这种方式获取锁定?

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 >>