回答編集履歴

3

追記

2018/01/23 03:52

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -132,10 +132,106 @@
132
132
 
133
133
 
134
134
 
135
+ 質問の修正後の追記:
136
+
137
+
138
+
135
- ちなみに以下のことをやりたいのであればWaitGroupは不要です。
139
+ 変更は以下の2箇所
136
-
137
-
138
-
140
+
141
+
142
+
139
- - 10個のgoroutineを起動てそれぞれがchan通じて結果返してgoroutineが終了
143
+ - 「起動したgoroutine群が完走たらsigクローズする処理」をgoroutineで動かしておく。
140
-
144
+
141
- - mainはそれの結果を受待つ
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

文言修正

2018/01/23 03:52

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  - 書き込みを行うgoroutineと読み出しを行うgoroutineが必要。
10
10
 
11
- - 読み待ちと書き待ちが同時に待ちにった時に通信が成立する。
11
+ - 読み待ちと書き待ちが同時に待ち状態った時に通信が成立する。
12
12
 
13
13
 
14
14
 

1

追記

2018/01/22 22:17

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -28,11 +28,17 @@
28
28
 
29
29
 
30
30
 
31
+ それで唯一待ちになっていなかった
32
+
31
- それで唯一待ちになっていなかったmainのgoroutineがwg.Wait()により待ちにはいると、全てのgoroutineが待ちに入ったことになり、
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はそれらの結果を受けとるのを待つ