让我们有以下简单的互斥锁定义:
class Mutex {
private:
bool lock;
public:
void acquire();
void release();
Mutex() {
lock = 0;
}
};
以及以下acquire()
func 实现(使用比较和交换操作):
void Mutex::acquire() {
bool oldValue;
__atomic_load(&lock, &oldValue, 0);
bool newValue = true;
while (!__atomic_compare_exchange_n(&lock, &oldValue, newValue, true, 0, 0)) {
sched_yield();
}
}
在这种情况下,我们得到以下汇编代码:
movzx eax, BYTE PTR [rsp+15]
lock cmpxchg BYTE PTR [rbx], bpl
je .L9
或者在使用的情况下__atomic_test_and_set
:
void Mutex::acquire() {
while (__atomic_test_and_set(&lock, 0)) {
sched_yield();
}
}
我们得到以下汇编代码:
mov eax, ebp
xchg al, BYTE PTR [rbx]
test al, al
jne .L6
但是,如果我们没有对原子测试和设置和 CAS 操作(xchg
以及lock cmpxchg
x86 和其他架构上的等效操作)的硬件支持怎么办?在这种情况下编译器将使用什么解决方案?
PS - 我使用 gcc 8.2 生成汇编代码,这里是__atomic_
内置函数:https ://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html