Go语言学习五:异步、同步、锁
一 、异步、同步控制
在Go中并行与并发是有区别的,详细请参考Go 并发 、并行、线程池, 通过信道的方式来实现同步 譬如 var change =make( chan int), 而后对此信道进行数据读写且信道读写是阻塞式的。
varchange =make(chanint)
typeMessagestruct{
idint
datastring
dofunc(prestring,idint)
}
funcaddMessage(reqstring,m Message) {
m.do(req+m.data,m.id)
}
funcmain() {
//查询当前运行使用CPU数量
fmt.Println("设定本机可用CPU的数量:",runtime.NumCPU())
//设定当前CPU 可使用的数量
runtime.GOMAXPROCS(4)
varn =1
task := Message{id: n,data:"i am message"}
task.do =func(prestring,idint) {
fmt.Println(id,pre)
change <-1
}
goaddMessage("welcome",task)
<-change
}
二 锁机制
/**
sync 包中实现了两个关于锁的数据类型,sync.Mutex 和 sync.RWMutex。[ 互斥锁 mutex 是独占型,只能 lock 一次, unlock 一次,
然后才能继续 lock 否则阻塞。
读写互斥锁 reader-writer mutex 是所有的 reader 共享一把锁或是一个 writer 独占一个锁,
如果一个 reader lock 到锁了, 其他的 reader 还可以 lock 但是 writer 不能 lock 。 ]
对于 sync.Mutex 或是 sync.RWMutex 类型的变量 mutex 来说,假定 n < m,
对于 mutex.Unlock() 的第 n 次调用在 mutex.Lock() 的第 m 次调用返回之前发生。
[ 对于一个 mutex 来说,lock 一下,第二次 lock 会阻塞,只有 unlock 一下才可以继续 lock,就是这个意思。
然而 unlock 一个没有 lock 的 mutex 会怎么样呢?error ! ]
*/
varl sync.Mutex
funcfoo() {
fmt.Println("hello,world")
l.Unlock()
}
funcmain() {
fmt.Println("1")
l.Lock()
gofoo()
fmt.Println(3)
l.Lock()
fmt.Println("2")
}