teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2018/01/23 03:52

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -65,7 +65,55 @@
65
65
  }
66
66
  ```
67
67
 
68
- ちなみに以下ことをやりたいであればWaitGroupは不要です。
68
+ 質問修正後追記:
69
69
 
70
+ 変更は以下の2箇所
71
+
70
- - 10個のgoroutineを起動してそれぞれchan通じて結果してgoroutineが終了
72
+ - 起動したgoroutine群完走したらsigクローズする処理」goroutineで動かしておく。
71
- - mainはそれの結果を受待つ
73
+ - 無限ループかける処理いれる。
74
+
75
+ [https://play.golang.org/p/SBuJsGJ417m](https://play.golang.org/p/SBuJsGJ417m)
76
+ ```go
77
+ package main
78
+
79
+ import (
80
+ "fmt"
81
+ "sync"
82
+ )
83
+
84
+ func main() {
85
+ wg := sync.WaitGroup{}
86
+ sig := make(chan bool)
87
+ for i := 0; i < 10; i++ {
88
+ wg.Add(1)
89
+ go func(i int) {
90
+ fmt.Println(i)
91
+ if i == 3 {
92
+ sig <- true
93
+ } else {
94
+ sig <- false
95
+ }
96
+ wg.Done()
97
+ }(i)
98
+ }
99
+
100
+ go func() {
101
+ wg.Wait()
102
+ close(sig)
103
+ }()
104
+
105
+ for {
106
+ v, ok := <-sig
107
+ if !ok {
108
+ break
109
+ }
110
+ if v {
111
+ fmt.Println("True")
112
+ } else {
113
+ fmt.Println("False")
114
+ }
115
+ }
116
+
117
+ fmt.Println("All Done")
118
+ }
119
+ ```

2

文言修正

2018/01/23 03:52

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  キューに長さを持たないchanを「unbuffered chan」と呼びますが、以下の特徴があります。
4
4
 
5
5
  - 書き込みを行うgoroutineと読み出しを行うgoroutineが必要。
6
- - 読み待ちと書き待ちが同時に待ちにった時に通信が成立する。
6
+ - 読み待ちと書き待ちが同時に待ち状態った時に通信が成立する。
7
7
 
8
8
 
9
9
  つまりデッドロックになる事例は

1

追記

2018/01/22 22:17

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -13,9 +13,12 @@
13
13
  以後はsigチャンネルを読もうとするgoroutineがいません。
14
14
  なのでその他のgoroutineは全て書き込み待ちのままになります。
15
15
 
16
+ それで唯一待ちになっていなかった
16
- それで唯一待ちになっていなかったmainのgoroutineがwg.Wait()により待ちにはいると、全てのgoroutineが待ちに入ったことになり、
17
+ mainのgoroutineがwg.Wait()により待ちにはいると、
18
+ 全てのgoroutineが待ちに入ったことになり、
17
19
  これをgoのランタイムが検出するとこの件のような
18
20
  「all goroutines are asleep - deadlock!」panicを出します。
21
+ (なぜわざわざこういうことをするのかはよく考えてみましょう。)
19
22
 
20
23
  後者のコードはmain以外に待ちに入るコードがないので起動した10個のgoroutineは順当に完走してwg.Wait()コールはちゃんと帰ってきます。
21
24
 
@@ -60,4 +63,9 @@
60
63
  close(sig)
61
64
  fmt.Println("All Done")
62
65
  }
63
- ```
66
+ ```
67
+
68
+ ちなみに以下のことをやりたいのであればWaitGroupは不要です。
69
+
70
+ - 10個のgoroutineを起動してそれぞれがchanを通じて結果を返してgoroutineが終了
71
+ - mainはそれらの結果を受けとるのを待つ