# 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


# sync.WaitGroup

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

ZJM 微信支付

微信支付

ZJM 支付宝

支付宝