Skip to content

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy