Golang合集

Go语言学习五:异步、同步、锁

2018-01-13  本文已影响319人  孙小兵

一 、异步、同步控制

在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")

}

上一篇下一篇

猜你喜欢

热点阅读