Pav*_*vel 1 struct pointers go race-condition
当我运行我的代码时出现竞争条件。它是并发安全存储的简单实现。当我将 get() 方法中的接收器更改为(p *storageType)
. 我糊涂了。我需要一个可以向我解释这种行为的人。
package main
type storageType struct {
fc chan func()
value int
}
func newStorage() *storageType {
p := storageType{
fc: make(chan func()),
}
go p.run()
return &p
}
func (p storageType) run() {
for {
(<-p.fc)()
}
}
func (p *storageType) set(s int) {
p.fc <- func() {
p.value = s
}
}
func (p storageType) get() int {
res := make(chan int)
p.fc <- func() {
res <- p.value
}
return <-res
}
func main() {
storage := newStorage()
for i := 0; i < 1000; i++ {
go storage.set(i)
go storage.get()
}
}
Run Code Online (Sandbox Code Playgroud)
在main()
该storage
变量的类型的*storageType
。如果storageType.Get()
有值接收者,则storage.get()
表示(*storage).get()
。
该get()
调用storageType
作为接收者,因此storage
必须取消引用指针变量以进行复制(将用作接收者值)。这种复制意味着storageType
必须读取指向结构的值。但是此读取与run()
读取和写入结构(其value
字段)的方法不同步。
如果您将 的接收器更改get()
为指针(类型*storageType
),则接收器将再次成为副本,但这次它将是指针的副本,而不是指向的结构体。因此不会发生结构的非同步读取。
请参阅可能的重复项:为什么不读取/写入其内容的结构体的方法仍会导致竞争情况?
归档时间: |
|
查看次数: |
63 次 |
最近记录: |