回答編集履歴
4
一段落、コメントから追記
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
微修正
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
念の為1:int global変数はTLS(Thread Local Storage)ではない
|
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
引数をパラメータに変更
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);```
|
51
|
+
その直後、各スレッドは```sleep(1);``` している。眠りから覚めた3つのスレッドが```printf(" ・・・global = %d\n", ・・・ global);```で表示するのは、スリープする直前、**最後に上書きした値**と思われる。
|
52
52
|
|
53
53
|
|
54
54
|
|
1
スペルミスを修正
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
念の為1:int global変数はTLS(Thread Lo
|
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
|
|