代码之家  ›  专栏  ›  技术社区  ›  bzim

获取自旋锁需要比较和交换还是交换就足够了?

  •  1
  • bzim  · 技术社区  · 6 年前

    假设我们有一个 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 回复  |  直到 6 年前
        1
  •  1
  •   LWimsey    6 年前

    比较和交换不是真的必要。以原子方式设置标志 true 如果是的话 false 在逻辑上等价于无条件地设置它 .

    下面是一个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);
        }
    };