[zeromicro/go-zero]feat: tokenLimiter.startMonitor 对锁的占用

2023-12-25 946 views
2

原子操作代替 lock

回答

1

这个不对的,lim.monitorStarted怎么保障原子性?

0

atomic 可以保证最终的原子性,只启动一个 waitRedis monitorStarted 留着是因为在redis恢复期间大多数调用可以直接 fastfail,可以不需要锁

8

外部的monitorStarted没有保护,先要保证正确,然后才是精简和性能

5
func (lim *TokenLimiter) startMonitor() {
    if lim.monitorStarted {
        return
    }

    if atomic.CompareAndSwapUint32(&lim.redisAlive, 1, 0) {
        lim.monitorStarted = true
        go lim.waitForRedis()
    }
}

最终正确性由 CompareAndSwapUint32 可以保证,其实 monitorStarted 这个变量都可以去掉了,保留的原因是这样连原子开销都可以不用了

2

if lim.monitorStarted 和 lim.monitorStarted = true 同时执行呢?