# golang-ants 协程池
# 前置知识
# sync.Locker
sync.Locker 是 golang 1.9 版本引入的一个接口,它定义了两个方法,Lock () 和 Unlock ()。sync.Mutex 和 sync.RWMutex 都实现了这个接口。
type Locker interface { | |
Lock() | |
Unlock() | |
} |
# sync.Mutex
# spinLock
spinLock 是一种自旋锁,它通过不断循环等待锁的释放,而不是直接进入阻塞状态。自旋锁适用于锁的持有时间较短的情况,因为它避免了线程切换的开销。但是,如果锁的持有时间较长,自旋锁会导致 CPU 资源的浪费,因此需要根据实际情况选择合适的锁类型。
// github.com/panjf2000/ants/v2@v2.11.2/pkg/sync/spinlock.go | |
type spinLock uint32 | |
const maxBackoff = 16 | |
func (sl *spinLock) Lock() { | |
backoff := 1 | |
for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1) { | |
// Leverage the exponential backoff algorithm, see https://en.wikipedia.org/wiki/Exponential_backoff. | |
for i := 0; i < backoff; i++ { | |
runtime.Gosched() | |
} | |
if backoff < maxBackoff { | |
backoff <<= 1 | |
} | |
} | |
} | |
func (sl *spinLock) Unlock() { | |
atomic.StoreUint32((*uint32)(sl), 0) | |
} |
# sync.Cond
sync.Cond 是 go