回答編集履歴

4

一段落、コメントから追記

2017/07/29 22:00

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -23,6 +23,12 @@
23
23
  2番目にcreateしたスレッド、即ち num == 1を渡したつもりのスレッドが、
24
24
 
25
25
  いざ動き出し```num = *(int*)arg;```と**アクセスした時は、既にmain()側の for 文によってnumの値が2になった後**だった、よって tls 変数にも2が代入されてしまった。残念!
26
+
27
+
28
+
29
+ 一段落を追記。
30
+
31
+ 3つのスレッドは0→1→2→3というnumの変化に同期して生成されるが、同期してるのはあくまで「スケジューリング対象にする」作業でしかない。実際にfunc()が動くタイミングはスケジューラに任されるので、いつ動くか、それは予想がつかないことなのだ。よって0→1→2→3というnumの変化とfunc()の動作は同期しない。
26
32
 
27
33
 
28
34
 

3

微修正

2017/07/29 22:00

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- 念の為1:int global変数はTLS(Thread Local Storage)ではないので、実体は一個の変数である。3つのスレッドが```global = num;``` する都度、値は上書きされる。
49
+ 念の為1:int global変数はTLS(Thread Local Storageと言うのかw)ではない、実体は一個の変数である。3つのスレッドが```global = num;``` する都度、値は上書きされる。
50
50
 
51
51
  その直後、各スレッドは```sleep(1);``` している。眠りから覚めた3つのスレッドが```printf(" ・・・global = %d\n", ・・・ global);```で表示するのは、スリープする直前、**最後に上書きした値**と思われる。
52
52
 

2

引数をパラメータに変更

2017/07/27 15:53

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- 各スレッドに渡す引数を、こう安易に渡したのが不具合の原因だろう。
11
+ 各スレッドに渡すパラメータを、こう安易に渡したのが不具合の原因だろう。
12
12
 
13
13
  ```C
14
14
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- main()側は、各スレッドに渡す引数を、それぞれ異なるメモリに格納して渡せば良いだろう。例えばこんな風に。
29
+ main()側は、各スレッドに渡すパラメータを、それぞれ異なるメモリに格納して渡せば良いだろう。例えばこんな風に。
30
30
 
31
31
  ```C
32
32
 
@@ -48,7 +48,7 @@
48
48
 
49
49
  念の為1:int global変数はTLS(Thread Local Storage)ではないので、実体は一個の変数である。3つのスレッドが```global = num;``` する都度、値は上書きされる。
50
50
 
51
- その直後、各スレッドは```sleep(1);``` る。眠りから覚めた3つのスレッドが```printf(" ・・・global = %d\n", ・・・ global);```で表示するのは、スリープする直前、**最後に上書きした値**と思われる。
51
+ その直後、各スレッドは```sleep(1);``` している。眠りから覚めた3つのスレッドが```printf(" ・・・global = %d\n", ・・・ global);```で表示するのは、スリープする直前、**最後に上書きした値**と思われる。
52
52
 
53
53
 
54
54
 

1

スペルミスを修正

2017/07/27 15:48

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- 念の為1:int global変数はTLS(Thread Loval Storage)ではないので、実体は一個の変数である。3つのスレッドが```global = num;``` する都度、値は上書きされる。
49
+ 念の為1:int global変数はTLS(Thread Local Storage)ではないので、実体は一個の変数である。3つのスレッドが```global = num;``` する都度、値は上書きされる。
50
50
 
51
51
  その直後、各スレッドは```sleep(1);``` する。眠りから覚めた3つのスレッドが```printf(" ・・・global = %d\n", ・・・ global);```で表示するのは、スリープする直前、**最後に上書きした値**と思われる。
52
52