golang以打印机为例 互斥锁的问题 使用channel解决
package main
import (
"fmt"
"time"
)
func person1(str string,c chan <-int) {
printer(str)
c<-1 //往里面写
}
func person2(c <- chan int,o chan <-bool) {
if num:=<-c;num==1{
printer("world")
}
o<-true
}
func printer(str string) {
for _,data:=range str{
fmt.Printf("%c",data)
time.Sleep(time.Second)
}
fmt.Println()
}
func main() {
c:=make(chan int)
o:=make(chan bool)
go person1("hello",c)
go person2(c,o)
for{
if nu,_:=<-o;nu==true{
fmt.Println("6666")
return
}
}
}
————————————————————————————————————————————————————————————
使用sync.Mutex程序执行结果与多任务资源竞争时一致。最终由于添加了互斥锁,可以按序先输出hello再输出 world。但这里需要我们自行创建互斥锁,并在适当的位置对锁进行释放。
package main
import (
"fmt"
"sync"
"time"
)
var mutex sync.Mutex
func person1(str string) {
printer(str)
}
func person2() {
printer("world")
}
func printer(s string) {
mutex.Lock() //添加互斥锁
for _,data:= range s{
fmt.Printf("%c",data)
time.Sleep(time.Second)
}
fmt.Println()
defer mutex.Unlock() //使用结束时解锁
}
func main() {
go person1("hello")
go person2()
for {
;
}
}