Mutex实现,无需硬件支持的“测试设置”和CAS操作

时间:2018-10-22 04:37:10

标签: c++ x86 atomic compare-and-swap test-and-set

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

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上的xchglock cmpxchg以及其他体系结构上的等效物) ?在这种情况下,编译器将使用什么解决方案?

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

0 个答案:

没有答案