【发布时间】:2020-12-05 14:51:03
【问题描述】:
我在想 Go 中的 mutex 会锁定数据,并且不允许任何其他 goroutine 读/写,除非拳头 goroutine 释放锁定。看来我的理解是错误的。阻止其他goroutine 读/写的唯一方法是在其他goroutines 中调用lock。这将确保critical section 被一个且只有一个goroutine 访问。
所以,我预计this 代码会出现死锁:
package main
import(
"fmt"
"sync"
)
type myMap struct {
m map[string]string
mutex sync.Mutex
}
func main() {
done := make(chan bool)
ch := make(chan bool)
myM := &myMap{
m: make(map[string]string),
}
go func() {
myM.mutex.Lock()
myM.m["x"] = "i"
fmt.Println("Locked. Won't release the Lock")
ch <- true
}()
go func() {
<- ch
fmt.Println("Trying to write to the myMap")
myM.m["a"] = "b"
fmt.Println(myM)
done <- true
}()
<- done
}
由于第一个goroutine 锁定了结构,我希望第二个goroutine 无法读取/写入结构,但这里不会发生这种情况。
如果我在第二个goroutine 中添加mux.Lock(),那么就会出现死锁。
我觉得mutex 在 Go 中的工作方式有点奇怪。如果我锁定,那么 Go 不应该允许任何其他 goroutine 读取/写入它。
有人可以向我解释 Go 中的互斥锁概念吗?
【问题讨论】:
-
你为什么说第一个 goroutine “锁定了结构”呢?它锁定了一个互斥锁,是的。是什么让您认为互斥锁锁定了结构而不是其他东西?
-
我在想结构锁中的互斥锁不仅仅是互斥锁,还有结构本身,这只是我的理解不好。
标签: multithreading go mutex goroutine