试图了解屏障的以下实现。目标是_entry
只能输入一次。我唯一没有得到的部分是使用%rip
。显然它会在mutex(%rip)=0
时旋转,但为什么会这样?
.section data
mutex:
.long 0
.section text
...
_entry:
xor %rax, %rax
xchgl mutex(%rip), %rax
cmp %rax, 0
jnz _entry
答案 0 :(得分:0)
这是一个自旋锁,因为它基本上是:
mutex(%rip)
是RIP相对(相对指令指针)寻址。它只是一个变量。可以是任何其他变量。
这个伪代码就是这样的:
_entry:
x = 0;
swap(mutex, x);
if (x != 0)
goto _entry;
但是突出显示swap()
,即xchg
(交换操作)。反过来,这是一个ATOMIC操作。这就是保证2个不同的线程不会修改这个"锁定变量" (mutex
)同时。{/ p>
作为EXTRA的有用信息:
注意:"锁定变量"在此示例中称为mutex
。但实际上它取决于你使用的词汇。大多数情况下,这不会被视为"互斥"。可以使用互斥锁或自旋锁或互斥锁+自旋锁的混合来完成锁定。但上面的例子不是混合的东西。变量名称应该是除mutex
之外的其他内容。