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使用协作式多任务处理;它不使用抢先式诱变:计算机多任务处理。您需要使调度程序有机会在锁之间运行。例如,通过调用Gosched(),
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
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()
runtime.Gosched()
}
输出:
[WB][WB0]write start
[WB][WB0]write end
[WA][WA0]write start
[WA][WA0]write end
[WB][WB1]write start
[WB][WB1]write end
[WA][WA1]write start
[WA][WA1]write end
[WB][WB2]write start
[WB][WB2]write end
[WA][WA2]write start
[WA][WA2]write end
[WB][WB3]write start
[WB][WB3]write end
[WA][WA3]write start
[WA][WA3]write end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句