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

回答編集履歴

3

補足追記

2021/09/27 04:41

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -3,10 +3,10 @@
3
3
 
4
4
  - チャネルの受信待ちに入る時、未送信待ちの場合は所属goroutineをブロックしgoroutineスイッチする
5
5
  - チャネルの受信完了でgoroutine再開対象になる
6
- - チャネルの受信待ちに入る時、送信待ち済みの場合はgoroutineスイッチしません
6
+ - チャネルの受信待ちに入る時、送信待ち済みの場合は直ちに受信してgoroutineスイッチしません
7
7
  - チャネルの送信待ちに入る時、未受信待ちの場合は所属goroutineをブロックしgoroutineスイッチする
8
8
  - チャネルの送信完了でgoroutine再開対象になる
9
- - チャネルの送信待ちに入る時、受信待ち済みの場合はgoroutineスイッチしません
9
+ - チャネルの送信待ちに入る時、受信待ち済みの場合は直ちに送信してgoroutineスイッチしません
10
10
  - goroutine再開対象が複数ある場合はランダムなgoroutineが選ばれて動作を再開する(今回の例では2つしかgoroutineがないので必ずもう一つのgoroutineが動作を再開する)
11
11
 
12
12
  `case c <- x:`を`S`、`<-c`を`R`と記述してこのコードでどういう順番が発生しているのかを列挙してみましょう。

2

追記

2021/09/27 04:40

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -1,20 +1,24 @@
1
1
  これチャネルの挙動をよく知っていないと理解しにくいです。
2
+ mainのgoroutine(送信側)とmain関数内で起こしたgoroutine(受信側)の2つが切り替わりながら動作します。
2
3
 
3
- - チャネルの受信待ち状態と実際の受信の間にgoroutineスイッチが入場合と入らない場合がある。
4
+ - チャネルの受信待ちに入る時、未送待ち場合は所属goroutineをブロックしgoroutineスイッチ
5
+ - チャネルの受信完了でgoroutine再開対象になる
6
+ - チャネルの受信待ちに入る時、送信待ち済みの場合はgoroutineスイッチしません
4
- - チャネルの送信待ち状態と実際の送信の間にgoroutineスイッチが入場合と入らない場合がある。
7
+ - チャネルの送信待ちに入る時、未受待ち場合は所属goroutineをブロックしgoroutineスイッチ
8
+ - チャネルの送信完了でgoroutine再開対象になる
9
+ - チャネルの送信待ちに入る時、受信待ち済みの場合はgoroutineスイッチしません
10
+ - goroutine再開対象が複数ある場合はランダムなgoroutineが選ばれて動作を再開する(今回の例では2つしかgoroutineがないので必ずもう一つのgoroutineが動作を再開する)
5
11
 
6
- mainのgoroutineとmain関数内で起こしたgoroutineの2つが切り替わりながら動作します。
7
12
  `case c <- x:`を`S`、`<-c`を`R`と記述してこのコードでどういう順番が発生しているのかを列挙してみましょう。
8
13
 
9
- - x=0を`S`送信待ちに入る(goroutineスイッチ)
14
+ 1. 初回の`S`送信待ちに入る(goroutineスイッチ)
15
+ 2. 初回の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
10
- - `R`受信待ちに入る(goroutineスイッチ)
16
+ 3. 次の`R`受信待ちに入る(goroutineスイッチ)
11
- - `S`送信->`R`受信で「0 Goルーチンの方」が表示される
12
- - `R`受信待ちに入る(goroutineスイッチ)
13
- - 「フィボナッチの方」が表示される
17
+ 4. 送信側の処理が再開「フィボナッチの方」が表示される
14
- - 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
18
+ 5. 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
15
- - `S`送信待ちに入る(goroutineスイッチ)
19
+ 6. 次の`S`送信待ちに入る(goroutineスイッチ)
16
- - `R`受信「Goルーチンの方」が表示される
20
+ 7. 受信側の処理が再開「Goルーチンの方」が表示される
17
- - 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
21
+ 8. 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
18
- - 以上を繰り返す
22
+ 9. 3.に戻って繰り返す
19
23
 
20
24
  結果としてそれぞれ2回ずつの表示を繰り返す挙動になります。

1

投稿時にブラウザエラー発生、ロストした記述を書き直しました。

2021/09/27 04:39

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -3,6 +3,7 @@
3
3
  - チャネルの受信待ち状態と実際の受信の間にgoroutineスイッチが入る場合と入らない場合がある。
4
4
  - チャネルの送信待ち状態と実際の送信の間にgoroutineスイッチが入る場合と入らない場合がある。
5
5
 
6
+ mainのgoroutineとmain関数内で起こしたgoroutineの2つが切り替わりながら動作します。
6
7
  `case c <- x:`を`S`、`<-c`を`R`と記述してこのコードでどういう順番が発生しているのかを列挙してみましょう。
7
8
 
8
9
  - x=0を`S`送信待ちに入る(goroutineスイッチ)
@@ -10,7 +11,10 @@
10
11
  - `S`送信->`R`受信で「0 Goルーチンの方」が表示される
11
12
  - `R`受信待ちに入る(goroutineスイッチ)
12
13
  - x「フィボナッチの方」が表示される
13
- - 受信待ち済みなので直接`S`送信
14
+ - 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
14
- - 「フィボナッチの方」が表示される
15
15
  - `S`送信待ちに入る(goroutineスイッチ)
16
- - `R`受信で「1 Goルーチンの方」が表示される
16
+ - `R`受信で「Goルーチンの方」が表示される
17
+ - 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
18
+ - 以上を繰り返す
19
+
20
+ 結果としてそれぞれ2回ずつの表示を繰り返す挙動になります。