【发布时间】:2022-01-24 03:13:31
【问题描述】:
下面是我的测试代码
type Data struct {
data int
}
func printData(c chan *Data) {
time.Sleep(time.Second * 1)
data := <-c
for {
data.data = 100
}
}
func main() {
fmt.Println("Main started...")
a := Data{data: 1}
b := &a
//create channel
c := make(chan *Data, 10)
go printData(c)
fmt.Println(fmt.Printf("Value of b before putting into channel %v", *b))
c <- b
for {
b.data = 20
}
}
我使用go build -race 构建二进制文件,正如预期的那样发生了数据竞争
我的怀疑是我认为传递指针不正确,因为当使用具有多个 goroutine 的通道时,通道有一个锁,但是一个指向通道的传递指针,导致 goroutine 需要添加另一个锁来保护数据竞争。很奇怪
所以我的理解是对的?
【问题讨论】:
标签: go