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释放);
}
};