2 回答
TA贡献1805条经验 获得超10个赞
使用不当sync.WaitGroup是导致您出现竞争状况的原因。其中任何一个都应该正常工作:
func (outer *outer) modify(wg *sync.WaitGroup) {
outer.Lock()
outer.num = outer.num + 1
outer.Unlock()
wg.Done()
}
func (outer *outer) modify(wg *sync.WaitGroup) {
outer.Lock()
defer wg.Done()
defer outer.Unlock()
outer.num = outer.num + 1
}
wg.Done()应该在解锁互斥锁之后调用(延迟调用以 LIFO 方式进行),因为之前调用它会导致调用Printf()与最后一个outer.Unlock()调用竞争以访问outer.
TA贡献1891条经验 获得超3个赞
package main
import (
"fmt"
"sync"
)
type outer struct {
*sync.Mutex
num int
foo string
}
func (outer *outer) modify(wg *sync.WaitGroup) {
outer.Lock()
defer outer.Unlock()
outer.num++
wg.Done()
}
func main() {
outer := outer{
Mutex: &sync.Mutex{},
num: 2,
foo: "hi",
}
w := &sync.WaitGroup{}
for j := 0; j < 5000; j++ {
w.Add(1)
go outer.modify(w)
}
w.Wait()
fmt.Printf("Final is %+v", outer)
}
将sync.Mutex 更改为指针。
我认为这是由于sync.Mutex 在您的版本中很有价值
- 2 回答
- 0 关注
- 108 浏览
添加回答
举报