获取自旋锁是否需要比较并交换(compare-and-swap)或者交换(swap)就足够了?

3
假设我们有一个自旋锁实现:
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) {}
}

但是仅仅进行交换是否就足够了呢?像这样的操作:
```python a, b = b, a ```
是不是就可以了呢?
fun lock(lock : &Lock) {
    while atomic_swap(&lock.locked, true, acquire) {}
}

这个有问题吗?

1个回答

2
一个比较和交换并不是必要的。如果它是false,则以原子方式将标记设置为true,在逻辑上等同于无条件地将其设置为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);
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接