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

}