上题
初步代码实现:
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()
}