go
go copied to clipboard
timing wheel data race
https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L148 https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L154 https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L112
Thank you @wllenyj
Do you think what is the best way to fix it? Maybe Lock?
w.tv1[index] = make([]*timer, 0, defaultTimerSize)
or
var pool = &sync.Pool{
New: func() interface{} {
return make([]*timer, 0, defaultTimerSize)
},
}
w.tv1[index] = pool.Get().([]*timer)
f := func(vec []*timer) {
//.....
vec = vec[0:0: defaultTimerSize]
pool.Put(vec)
}
another one, should add sync/atomic https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L145 https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L194 https://github.com/siddontang/go/blob/2b7082d296ba89ae7ead0f977816bddefb65df9d/time2/wheel.go#L204