【发布时间】:2019-06-18 09:55:58
【问题描述】:
- 我看到有些人在一个结构中取出了一些互斥锁。有必要吗?或者我们可以简单地在那里放一个锁吗? 示例:
type Session struct {
// some other irrelevant code
pingLock sync.Mutex
// some other irrelevant code
streamLock sync.Mutex
// some other irrelevant code
shutdownLock sync.Mutex
}
- 如果一个结构包含另一个结构,而子结构包含映射或切片,我应该将互斥体、父结构或子结构放在哪里?
- 为什么 mutex.Lock() 在我的代码中不起作用?每次我进行比赛测试时,它都会显示有比赛。
起初我试图解决前两个问题,所以我写了一些演示代码来测试它。我尝试使用子结构中的锁,然后使用父结构来锁定状态,但它们都不起作用。比赛测试一直说有比赛条件。
我试过t.Lock() 和t.data.Lock()。
type Test struct {
name string
data Data
sync.RWMutex //Should I put it here?
}
type Data struct {
d map[string]int
sync.RWMutex // Should I put it here?
}
func (t *Test) add(key string) {
t.data.Lock()
defer t.data.Unlock()
t.data.d[key] += 1
}
func (t *Test) read() {
for {
t.data.Lock()
_= t.data.d["test"]
t.data.Unlock()
}
}
func main() {
t := &Test{}
t.name = "oops"
t.data = Data{}
t.data.d = make(map[string]int)
t.data.d["test"] = 1
for i := 0; i <= 10; i++ {
go func(t *Test) {
t.add("test")
}(t)
go func(t *Test) {
t.read()
}(t)
}
time.Sleep(time.Second * 3)
fmt.Printf("result is %v", t.data.d["test"])
【问题讨论】:
标签: go struct concurrency mutex race-condition