一、多个协程交替依次按顺序打印0-40
1、channel控制多协程
package main
import (
"fmt"
"time"
)
func add(ch chan bool, num *int) {
ch <- true
*num = *num + 1
fmt.Println("num 的值:", *num)
<-ch
}
func main() {
// 创建一个size为1的channel
ch := make(chan bool, 1)
var num int
for i := 0; i <= 40; i++ {
//go add(ch, &num)
go func(ch chan bool, num *int) {
ch <- true
fmt.Println("num 的值:", *num)
*num = *num + 1
<-ch
}(ch, &num)
}
time.Sleep(2)
}
2、锁 控制多协程
import (
"fmt"
"sync"
"time"
)
func add(mux *sync.Mutex, num *int) {
mux.Lock()
fmt.Println("num 的值:", *num)
*num = *num + 1
mux.Unlock()
}
func main1() {
var mux sync.Mutex
var num int
for i := 0; i <= 40; i++ {
//go add(&mux, &num)
go func(mux *sync.Mutex, num *int) {
mux.Lock()
fmt.Println("num 的值:", *num)
*num = *num + 1
mux.Unlock()
}(&mux, &num)
}
time.Sleep(2)
}
二、4个协程交替依次按顺序打印0-40
package main
import (
"fmt"
"sync"
"time"
)
func main() {
f0()
f1()
}
func f0() {
wg := sync.WaitGroup{}
count := 0
wg.Add(4)
for i := 0; i < 4; i++ {
go func(i int) {
for {
if count > 40 {
wg.Done()
return
}
//并发执行的所有go程只有一个满足条件并执行
if count%4 == i {
fmt.Println(count)
count++
}
}
}(i)
}
wg.Wait()
}
func f1() {
ch1 := make(chan bool)
ch2 := make(chan bool)
ch3 := make(chan bool)
ch4 := make(chan bool)
go func() {
for i := 0; i <= 40; i += 4 {
<-ch1
fmt.Println(i)
ch2 <- true
}
}()
go func() {
for i := 1; i <= 40; i += 4 {
<-ch2
fmt.Println(i)
ch3 <- true
}
}()
go func() {
for i := 2; i <= 40; i += 4 {
<-ch3
fmt.Println(i)
ch4 <- true
}
}()
go func() {
for i := 3; i <= 40; i += 4 {
<-ch4
fmt.Println(i)
ch1 <- true
}
}()
ch1 <- true
time.Sleep(time.Second * 1)
}