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

Concurrency 获取自旋锁是否需要比较和交换,或者交换是否足够?,concurrency,atomic,spinlock,Concurrency,Atomic,Spinlock,假设我们有一个spinlock实现: struct Lock { locked : Atomic(bool), } 然后,解锁功能可以是: fun unlock(lock : &Lock) { atomic_store(&lock.locked, false, release); } 但是锁怎么办呢?通常,它使用如下比较和交换: fun lock(lock : &Lock) { while atomic_compare_and_swap(&am

假设我们有一个
spinlock
实现:

struct Lock {
    locked : Atomic(bool),
}
然后,解锁功能可以是:

fun unlock(lock : &Lock) {
    atomic_store(&lock.locked, false, release);
}
但是锁怎么办呢?通常,它使用如下比较和交换:

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) {}
}
但交换对这件事来说还不够吗?大概是这样的:

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) {}
}

这有什么问题吗?

实际上不需要比较和交换。如果标志
true
false
,则自动设置该标志在逻辑上等同于无条件地将其设置为
true

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

这里是一个C++代码锁的例子,使用<代码> Exchange()< <代码>

#包括
类互斥{
std::原子标志{false};
公众:
无效锁()
{
while(flag.exchange(true,std::memory_order_acquire));
}
无效解锁()
{
存储标志(错误,标准::内存\u顺序\u释放);
}
};