简介
对于短时间的locking,spin lock可以提供更好的性能,对比mutex lock。
因为spin lock不会让线程陷于睡眠,从而提供更好的性能
实现过程
一个低性能的的spin lock实现
struct tas_lock {
std::atomic<bool> lock_ = {false};
void lock() { while(lock_.exchange(true)); }
void unlock() { lock_.store(false); }
};
缺点:
- 使用了atomic默认的memory order:seq。开销太大
使用正确的memory order
struct tas_lock {
std::atomic<bool> lock_ = {false};
void lock() { while(lock_.exchange(true, std::memory_order_acquire)); }
void unlock() { lock_.store(false, std::memory_order_release); }
};
缺点:
每次判定是否lock都需要cas。导致开销大
在其他线程没有释放锁的时候,去lock,会不断的使用cas,而这并不是必要的
通过atomic read来先预判是否lock
struct ttas_lock {
...
void lock() {
for (;;) {
if (!lock_.exchange(true, std::memory_order_acquire)) {
break;
}
while (lock_.load(std::memory_order_relaxed));
}
}
...
};
缺点:
- 在发现已经上锁后,不断的去读lock的状态,导致消耗cpu资源
如果发现已经上锁了,通过pause cpu来减少spin的开销
struct ttas_lock {
...
void lock() {
for (;;) {
if (!lock_.exchange(true, std::memory_order_acquire)) {
break;
}
while (lock_.load(std::memory_order_relaxed)) {
__builtin_ia32_pause();
}
}
}
...
};
网友评论