回答編集履歴
3
追記
test
CHANGED
@@ -132,10 +132,106 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
+
質問の修正後の追記:
|
136
|
+
|
137
|
+
|
138
|
+
|
135
|
-
|
139
|
+
変更は以下の2箇所
|
136
|
-
|
137
|
-
|
138
|
-
|
140
|
+
|
141
|
+
|
142
|
+
|
139
|
-
-
|
143
|
+
- 「起動したgoroutine群が完走したらsigをクローズする処理」をgoroutineで動かしておく。
|
140
|
-
|
144
|
+
|
141
|
-
-
|
145
|
+
- 無限ループから抜ける処理をいれる。
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
[https://play.golang.org/p/SBuJsGJ417m](https://play.golang.org/p/SBuJsGJ417m)
|
150
|
+
|
151
|
+
```go
|
152
|
+
|
153
|
+
package main
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
import (
|
158
|
+
|
159
|
+
"fmt"
|
160
|
+
|
161
|
+
"sync"
|
162
|
+
|
163
|
+
)
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
func main() {
|
168
|
+
|
169
|
+
wg := sync.WaitGroup{}
|
170
|
+
|
171
|
+
sig := make(chan bool)
|
172
|
+
|
173
|
+
for i := 0; i < 10; i++ {
|
174
|
+
|
175
|
+
wg.Add(1)
|
176
|
+
|
177
|
+
go func(i int) {
|
178
|
+
|
179
|
+
fmt.Println(i)
|
180
|
+
|
181
|
+
if i == 3 {
|
182
|
+
|
183
|
+
sig <- true
|
184
|
+
|
185
|
+
} else {
|
186
|
+
|
187
|
+
sig <- false
|
188
|
+
|
189
|
+
}
|
190
|
+
|
191
|
+
wg.Done()
|
192
|
+
|
193
|
+
}(i)
|
194
|
+
|
195
|
+
}
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
go func() {
|
200
|
+
|
201
|
+
wg.Wait()
|
202
|
+
|
203
|
+
close(sig)
|
204
|
+
|
205
|
+
}()
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
for {
|
210
|
+
|
211
|
+
v, ok := <-sig
|
212
|
+
|
213
|
+
if !ok {
|
214
|
+
|
215
|
+
break
|
216
|
+
|
217
|
+
}
|
218
|
+
|
219
|
+
if v {
|
220
|
+
|
221
|
+
fmt.Println("True")
|
222
|
+
|
223
|
+
} else {
|
224
|
+
|
225
|
+
fmt.Println("False")
|
226
|
+
|
227
|
+
}
|
228
|
+
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
fmt.Println("All Done")
|
234
|
+
|
235
|
+
}
|
236
|
+
|
237
|
+
```
|
2
文言修正
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
- 書き込みを行うgoroutineと読み出しを行うgoroutineが必要。
|
10
10
|
|
11
|
-
- 読み待ちと書き待ちが同時に待ちに
|
11
|
+
- 読み待ちと書き待ちが同時に待ち状態になった時に通信が成立する。
|
12
12
|
|
13
13
|
|
14
14
|
|
1
追記
test
CHANGED
@@ -28,11 +28,17 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
+
それで唯一待ちになっていなかった
|
32
|
+
|
31
|
-
|
33
|
+
mainのgoroutineがwg.Wait()により待ちにはいると、
|
34
|
+
|
35
|
+
全てのgoroutineが待ちに入ったことになり、
|
32
36
|
|
33
37
|
これをgoのランタイムが検出するとこの件のような
|
34
38
|
|
35
39
|
「all goroutines are asleep - deadlock!」panicを出します。
|
40
|
+
|
41
|
+
(なぜわざわざこういうことをするのかはよく考えてみましょう。)
|
36
42
|
|
37
43
|
|
38
44
|
|
@@ -123,3 +129,13 @@
|
|
123
129
|
}
|
124
130
|
|
125
131
|
```
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
ちなみに以下のことをやりたいのであればWaitGroupは不要です。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
- 10個のgoroutineを起動してそれぞれがchanを通じて結果を返してgoroutineが終了
|
140
|
+
|
141
|
+
- mainはそれらの結果を受けとるのを待つ
|