多线程-两个线程交替打印数字
两个线程交替打印奇偶数
方案一:使用 channel 控制交替
package main
import (
"fmt"
"sync"
)
func main() {
oddChan := make(chan bool, 1) // 奇数
evenChan := make(chan bool, 1) // 偶数
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 1; i <= 10; i += 2 {
<-oddChan
fmt.Println("odd(奇数): ", i)
evenChan <- true
}
}()
go func() {
defer wg.Done()
for i := 2; i <= 10; i += 2 {
<-evenChan
fmt.Println("even(偶数): ", i)
oddChan <- true
}
}()
oddChan <- true
wg.Wait()
}

方案二:sync.Cond 条件变量实现
package main
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
var wg sync.WaitGroup
wg.Add(2)
turn := "A"
n := 5
go func() {
defer wg.Done()
for i := 0; i < n; i++ {
mu.Lock()
for turn != "A" {
cond.Wait() // 等待轮到 A
}
fmt.Println("odd: A")
turn = "B"
cond.Signal() // 通知 B
mu.Unlock()
}
}()
go func() {
defer wg.Done()
for i := 0; i < n; i++ {
mu.Lock()
for turn != "B" {
cond.Wait() // 等待轮到 B
}
fmt.Println("even: B")
turn = "A"
cond.Signal() // 通知 A
mu.Unlock()
}
}()
wg.Wait()
}

本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!