假设我们有一个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) {}
}
这有什么问题吗?
答案 0 :(得分:1)
真正没有必要进行比较和交换。从逻辑上将标志true
设置为false
等同于无条件地将其设置为true
。
无条件交换可能会稍快一些,因为它不需要比较任何东西,尽管原子读-修改-写操作的实际成本在于获取和锁定高速缓存行。
以下是使用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);
}
};