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

2023-12-25 482 views
7

原子操作代替 lock

回答

2

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

8

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

3

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

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

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

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

9

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