2

让我们有以下简单的互斥锁定义:

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 cmpxchgx86 和其他架构上的等效操作)的硬件支持怎么办?在这种情况下编译器将使用什么解决方案?

PS - 我使用 gcc 8.2 生成汇编代码,这里是__atomic_内置函数:https ://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

4

0 回答 0