-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
func (m *Master) AdjustSize(newSize int) {
if int64(newSize) > m.maxNum {
newSize = int(m.maxNum)
}
m.Lock()
defer m.Unlock()
if diff := newSize - int(m.ingNum); diff > 0 {
for i := 0; i < diff; i++ {
m.workers[m.ingNum] = newWorker()
atomic.AddInt64(&m.ingNum, 1)
}
} else if diff < 0 {
atomic.StoreInt64(&m.ingNum, int64(newSize))
if cursor := atomic.LoadInt64(&m.cursor); cursor > int64(newSize) {
atomic.StoreInt64(&m.cursor, int64(newSize))
}
for _, w := range m.workers[newSize:] {
if w == nil {
break
}
w.shutdown()
}
m.workers = m.workers[0:newSize]
}
}
func (m *Master) Running() int64 {
return atomic.LoadInt64(&m.ingNum)
}
func (m *Master) Shutdown() {
m.AdjustSize(0) // 关闭所有worker
}
func (m *Master) getWorker() *worker {
atomic.CompareAndSwapInt64(&m.cursor, m.ingNum, 0)
idx := atomic.AddInt64(&m.cursor, 1)
w := m.workers[idx-1]
return w
}
当cursor与原ingNum相等时,你要进行缩容
这个时候,如果是先把ingNum改成了新的值,再
atomic.CompareAndSwapInt64(&m.cursor, m.ingNum, 0)
运行这行时,就不会修改成功,然后你对cursor,进行了累加,导致越界,或有可能拿到一个nil对象。
还有就是你的代码里,对workers初始化的时候,用的是maxNum
但后面修改的时候,又用了ingNum做为他的长度。
我原以为你是要一开始声明一个确定长度的数组。但后面又换了,如果按你后面的逻辑
你一开始应该是
workers: make([]*worker, initNum,maxNum)
才对。
Metadata
Metadata
Assignees
Labels
No labels