获取自旋锁是否需要比较和交换,或者交换足够?

时间:2018-11-13 12:09:53

标签: concurrency atomic spinlock

假设我们有一个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) {}
}

这有什么问题吗?

1 个答案:

答案 0 :(得分:1)

真正没有必要进行比较和交换。从逻辑上将标志true设置为false等同于无条件地将其设置为true

无条件交换可能会稍快一些,因为它不需要比较任何东西,尽管原子读-修改-写操作的实际成本在于获取和锁定高速缓存行。

以下是使用exchange()

的C ++自旋锁的示例
#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);
    }
};