多线程-两个线程交替打印数字
两个线程交替打印奇偶数
方案一:使用 channel 控制交替
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 条件变量实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用