Go并发编程-模拟并发模型-案例1

上题
在这里插入图片描述
初步代码实现:

package main
import (
	"fmt"
	"sync"
	"time"
)
var wg sync.WaitGroup
var S1 bool   //S1,表示P1能否开始执行
var S2 bool   //S2,表示P1能否开始执行
var S3 bool   //S3,表示P1能否开始执行
var S4 int //S4,表示P4能否开始执行
func Example1(){

}
func p1(){
	defer wg.Done()
	for{
		S1 = true
		fmt.Println("正在执行p1")
		time.Sleep(3*time.Second)  //p1执行3秒
		fmt.Println("p1执行完毕")
		S2 = true; S3 =true;
		break
	}

}

func p2(){
	defer wg.Done()
	for{
		if  S2 {
			fmt.Println("正在执行p2")
			time.Sleep(3*time.Second)  //p2,p3并行3秒
			fmt.Println("p2执行完毕")
			S4 +=1
			break
		}
	}

}
func p3(){
	defer wg.Done()
	for{
		if S3{
			fmt.Println("正在执行p3")
			time.Sleep(3*time.Second) //p2,p3并行三秒
			fmt.Println("p3执行完毕")
			S4 += 1
			break
		}
	}

}

func p4(){
	defer wg.Done()
	for {
		if S4==2{
			fmt.Println("正在执行p4")
			time.Sleep(2*time.Second)
			fmt.Println("p4执行完毕")
			break
		}
	}

}
func main(){
	wg.Add(4)
	go p1()
	go p2()
	go p3()
	go p4()
	wg.Wait()
}

控制台输出(结果不唯一):

正在执行p1
	|3秒间隔|
p1执行完毕
正在执行p2
正在执行p3
	|3秒间隔|
p2执行完毕
p3执行完毕
正在执行p4
	|2秒间隔|
p4执行完毕

下面是使用chan来进行协程通信的代码实现:

package main
import (
	"fmt"
	"sync"
	"time"
)
var wg sync.WaitGroup
var S1 = make(chan bool)  //S1,表示P1能否开始执行
var S2 = make(chan bool)  //S2,表示P1能否开始执行
var S3 = make(chan bool)  //S3,表示P1能否开始执行
var S4 = make(chan bool,1)//S4,表示P4能否开始执行

func P(signal <- chan bool)bool{
	return <- signal
}
func V(signal chan <- bool){
	signal <- true
}
func p1(){
	defer wg.Done()
	P(S1)
	fmt.Println("正在执行p1")
	time.Sleep(3*time.Second)  //p1执行三秒
	fmt.Println("p1执行完毕")
	V(S2)
	V(S3);
}

func p2(){
	defer wg.Done()

	if P(S2){
		fmt.Println("正在执行p2")
		time.Sleep(3*time.Second)  //p2,p3并行3秒
		fmt.Println("p2执行完毕")
		V(S4)
	}

}

func p3(){
	defer wg.Done()

	if P(S3){
		fmt.Println("正在执行p3")
		time.Sleep(3*time.Second)  //p2,p3并行三秒
		fmt.Println("p3执行完毕")
		V(S4)
	}


}

func p4(){
	defer wg.Done()

	if P(S4){
		if P(S4) {
			fmt.Println("正在执行p4")
			time.Sleep(2*time.Second)  //p4执行两秒
			fmt.Println("p4执行完毕")
		}
	}


}
func main() {
	wg.Add(5)
	go func(){S1<-true;wg.Done()}()     //初始化线程,为了使信号量S1=1
	go p1()
	go p2()
	go p3()
	go p4()
	wg.Wait()
}

控制台输出:

正在执行p1
	|3秒间隔|
p1执行完毕
正在执行p3
正在执行p2
	|3秒间隔|
p3执行完毕
p2执行完毕
正在执行p4
	|2秒间隔|
p4执行完毕

船新版本(maybe final):

package ossync

import (
	"fmt"
	"sync"
	"time"

)
var wg sync.WaitGroup
var S1 = make(chan bool)  //S1,表示P1能否开始执行
var S2 = make(chan bool)  //S2,表示P1能否开始执行
var S3 = make(chan bool)  //S3,表示P1能否开始执行
var S4 = make(chan bool,1)//S4,表示P4能否开始执行
func sleep(seconds int){
	for i:=0;i<seconds;i++{
		time.Sleep(time.Second)
	}
}
func P(signal <- chan bool){
	for{
		if <-signal{break}
	}
}
func V(signal chan <- bool){
	signal <- true
}
func p1(){
	defer wg.Done()
	P(S1)
	fmt.Println("正在执行p1")
	sleep(3)
	fmt.Println("p1执行完毕")
	V(S2)
	V(S3);
}

func p2(){
	defer wg.Done()
	P(S2)
	fmt.Println("正在执行p2")
	sleep(3)
	fmt.Println("p2执行完毕")
	V(S4)

}

func p3(){
	defer wg.Done()

	P(S3)
	fmt.Println("正在执行p3")
	sleep(3)
	fmt.Println("p3执行完毕")
	V(S4)
}

func p4(){
	defer wg.Done()
	P(S4)
	P(S4)
	fmt.Println("正在执行p4")
	sleep(2)
	fmt.Println("p4执行完毕")
}
func Example1(){
	wg.Add(5)
	go func(){S1<-true;wg.Done()}()
	go p1()
	go p2()
	go p3()
	go p4()
	wg.Wait()
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值