有没有一种方法可以重置使用atomic.AddUint64递增的计数器?

时间:2019-05-29 07:23:03

标签: go mutex atomic

我正在为并发go应用程序实现全局计数器。

我的用例是计数器应在x秒后重置并写入DB。

我尝试使用互斥锁(我可以使用此值重置计数器)

当我增加计数器时,我也会记录一些东西。 我发现在应用程序运行约8-9个小时后,记录的行数与计数器值不匹配(互斥体版本),计数器值始终较小。 我仍然没有找到原因。

我以以下方式使用互斥锁

func (s *Metrics) AddQps() {
    s.qpsMu.Lock()
    s.qps++
    s.qpsMu.Unlock()
}


And the flushing of metrics is done as follows.

for {
    ticker := time.NewTicker(time.Duration(interval) * time.Second)
    select {
    case <-ticker.C:
       logger.Println("flushing metrics...")
    }
}

我已经实现了互斥锁部分引用 [How to create global counter in golang in highly concurrent system

由于上述问题,我现在尝试使用sync.atomic计数器。 因为我希望指标在x秒后刷新,所以我想重置计数器。

1 个答案:

答案 0 :(得分:1)

那么使用这样的东西有什么问题?

func TestNameAtomic(t *testing.T) {
    var i int64

    atomic.AddInt64(&i, 1)
    atomic.AddInt64(&i, 1)
    atomic.AddInt64(&i, 1)
    fmt.Println(i)

    atomic.CompareAndSwapInt64(&i, i, 0)
    fmt.Println(i)
}