是否获取自旋锁需要比较并交换或交换就够了吗?(Does acquiring a spinlock r

2019-09-28 09:27发布

假设我们有一个spinlock的实现:

struct Lock {
    locked : Atomic(bool),
}

然后解锁功能可以是:

fun unlock(lock : &Lock) {
    atomic_store(&lock.locked, false, release);
}

但是,什么lock ? 通常,它采用了比较并交换这样的:

fun lock(lock : &Lock) {
    while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}

但不会交换够吗? 事情是这样的:

fun lock(lock : &Lock) {
    while atomic_swap(&lock.locked, true, acquire) {}
}

是否有任何问题吗?

Answer 1:

一个比较并交换是不是真的有必要。 原子设置一个标志, true ,如果它是false是逻辑上等同于无条件设置它true

因为它不具有任何比较无条件交换可能会稍快一些,但原子的读 - 修改 - 写操作的实际成本是在获取和锁定的缓存行。

下面是一个使用一个C ++自旋锁的示例exchange()

#include <atomic>

class mutex {
    std::atomic<bool> flag{false};

public:
    void lock()
    {
        while (flag.exchange(true, std::memory_order_acquire));
    }

    void unlock()
    {
        flag.store(false, std::memory_order_release);
    }
};


文章来源: Does acquiring a spinlock require compare-and-swap or is swap enough?