Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 35d429f

Browse files
Create goroutine.md
1 parent 17c5a7c commit 35d429f

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed

‎Multi-Thread/goroutine.md

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# Goroutine
2+
3+
1. 两个协程轮流打印 `1, 2`
4+
5+
```go
6+
package main
7+
8+
import (
9+
"fmt"
10+
"sync"
11+
)
12+
13+
var wg sync.WaitGroup
14+
15+
func main() {
16+
wg.Add(2)
17+
ch1 := make(chan int)
18+
go func() {
19+
defer wg.Done()
20+
for i := 0; i < 10; i++ {
21+
ch1 <- i
22+
if i%2 == 0 {
23+
fmt.Println("1: ", i)
24+
}
25+
}
26+
}()
27+
go func() {
28+
defer wg.Done()
29+
for i := 0; i < 10; i++ {
30+
<-ch1
31+
if i%2 == 1 {
32+
fmt.Println("2: ", i)
33+
}
34+
}
35+
}()
36+
wg.Wait()
37+
}
38+
```
39+
40+
2. 三个协程轮流打印 `1, 2, 3`
41+
42+
```go
43+
package main
44+
45+
import (
46+
"fmt"
47+
"sync"
48+
)
49+
50+
func main() {
51+
var wg sync.WaitGroup
52+
wg.Add(2)
53+
ch1 := make(chan int)
54+
ch2 := make(chan int)
55+
go func() {
56+
defer wg.Done()
57+
for i := 0; i < 100; i++ {
58+
<-ch1
59+
<-ch2
60+
if i%3 == 0 {
61+
fmt.Println(1, ": ", i)
62+
}
63+
}
64+
}()
65+
go func() {
66+
defer wg.Done()
67+
for i := 0; i < 100; i++ {
68+
ch1 <- 1
69+
if i%3 == 1 {
70+
fmt.Println(2, ": ", i)
71+
}
72+
}
73+
}()
74+
go func() {
75+
defer wg.Done()
76+
for i := 0; i < 100; i++ {
77+
ch2 <- 1
78+
if i%3 == 2 {
79+
fmt.Println(3, ": ", i)
80+
}
81+
}
82+
}()
83+
wg.Wait()
84+
}
85+
```
86+
87+
3. 生产者消费者模型
88+
89+
```go
90+
package main
91+
92+
import (
93+
"fmt"
94+
"sync"
95+
)
96+
97+
var wg sync.WaitGroup
98+
var lock sync.Mutex
99+
100+
func main() {
101+
ch := make(chan int, 100)
102+
producer(ch)
103+
cnt := 3
104+
wg.Add(cnt)
105+
for i := 0; i < cnt; i++ {
106+
go consumer(i, ch)
107+
}
108+
wg.Wait()
109+
}
110+
111+
func producer(ch chan int) {
112+
defer close(ch)
113+
for i := 0; i < 10; i++ {
114+
fmt.Println("producer: ", i)
115+
ch <- i
116+
}
117+
}
118+
119+
func consumer(i int, ch chan int) {
120+
for {
121+
if v, ok := <-ch; ok {
122+
fmt.Println("consumer ", i, ":", v)
123+
} else {
124+
break
125+
}
126+
}
127+
wg.Done()
128+
}
129+
```
130+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /