【发布时间】:2021-08-19 12:16:40
【问题描述】:
我有一个代码sn-p:
type calculation struct{
sum int
mutex sync.Mutex
}
func dosomething(c *calculation , wg *sync.WaitGroup) {
c.mutex.Lock()
c.sum++
c.mutex.Unlock()
wg.Done()
}
func main() {
t := time.Now()
c := new(calculation)
wg := new(sync.WaitGroup)
for i:=0; i<10000000; i++{
wg.Add(1)
go dosomething(c, wg)
}
wg.Wait()
fmt.Println(c.sum)
fmt.Println(time.Since(t))
}
但我发现使用互斥指针也可以:
type calculation struct{
sum int
mutex *sync.Mutex
}
func dosomething(c *calculation , wg *sync.WaitGroup) {
c.mutex.Lock()
c.sum++
c.mutex.Unlock()
wg.Done()
}
func main() {
t := time.Now()
c := &calculation{0, new(sync.Mutex)}
wg := new(sync.WaitGroup)
for i:=0; i<10000000; i++{
wg.Add(1)
go dosomething(c, wg)
}
wg.Wait()
fmt.Println(c.sum)
fmt.Println(time.Since(t))
}
我对这两个版本做了一些测试,发现经过的时间很接近。
那么我应该使用哪一个?为什么我应该使用互斥体或互斥体指针?它们有性能差异吗?
【问题讨论】:
-
好吧,根据sync docs,“不应复制包含此包中定义的类型的[v]值。”。但是你不是在这里复制它,因为
c是一个指针。