让我们有以下简单的互斥量定义:
class Mutex {
private:
bool lock;
public:
void acquire();
void release();
Mutex() {
lock = 0;
}
};
以及以下acquire()
功能实现(使用比较和交换操作):
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操作的硬件支持(x86上的xchg
和lock cmpxchg
以及其他体系结构上的等效物) ?在这种情况下,编译器将使用什么解决方案?
P.S。 -我使用gcc 8.2生成汇编代码,这里是__atomic_
内置函数:https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html