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)
}
在控制台中的结果:
运行 mutex.go
[WB][WB0]写入开始
[WB][WB0]写入结束
[WB][WB1]写入开始
[WB][WB1]写入结束
[WB][WB2]写入开始
[WB][WB2]写入结束
[WB][WB3]写入开始
[WB][WB3]写入结束
[WB][WB4]写入开始
[WB][WB4]写入结束
[WB][WB5]写入开始
[WB][WB5]写入结束
[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例程没有机会?为什么互斥代码会停止另一个整个的go例程?
我知道肯定有一个关于它的故事或理论。请给我一个url阅读和学习。