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  {
		;
	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值