var m *sync.RWMutex
func main() {
m = new(sync.RWMutex)
n := 100
go func() {
for i := 0; i < n; i++ {
write("WA", i)
}
}()
go func() {
for i := 0; i < n; i++ {
write("WB", i)
}
}()
select {}
}
func write(tag string, i int) {
m.Lock()
fmt.Printf("[%s][%s%d]write start \n", tag, tag, i)
time.Sleep(100 * time.Millisecond)
fmt.Printf("[%s][%s%d]write end \n", tag, tag, i)
m.Unlock()
// time.Sleep(1 * time.Millisecond)
}
结果在控制台:
go run mutex.go
[WB][WB0]写开始
[WB][WB0]写结束
[WB][WB1]写开始
[WB][WB1]写结束
[WB][WB2]写开始
[WB][WB2] ]write end
[WB][WB3]write start
[WB][WB3]write end
[WB][WB4]write start
[WB][WB4]write end
[WB][WB5]write start
[WB][WB5]write end
[WB][WB6]写入开始
[WB][WB6]写入结束
[WB][WB7]写入开始
[WB][WB7]写入结束
[WB][WB8]写入开始
[WB][WB8]写入结束
[ WB][WB9]写开始
[WB][WB9]写结束...
> go version
go version go1.5.2 windows/amd64
问题是:为什么“[WA]”的go-routine没有机会?为什么互斥体代码会停止另一个完整的 go-routine?
我知道一定有关于它的故事或理论。请给我一个阅读和学习的网址。
慕婉清6462132
哔哔one
慕村225694
相关分类