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

回答編集履歴

4

訂正

2016/12/23 07:13

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,1 +1,4 @@
1
+ スレッドに対するCPUの割り当てが異なる事により、発生している様です。
2
+ 5スレッドの場合に、CPUの割り当てが大きく変化している様に見られます。
3
+ 実際に正しいものの中でも、各スレッドが起動順に結果が現れない場合が見れます。ただ五千万回のwhileループが行われている内に追いついている様子です。
1
- 親モジュールの領域更新するスレッドで、メモリをロック(mutex)する必要有るかと思います。
4
+ Linux環境でもスレッド数多くするスレッド遅れ発生して同様な現象起こります。

3

変更

2016/12/23 07:13

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,1 +1,1 @@
1
- スレッドはフォークとは異なり親モジュールのコピーはされないので、親の領域のアドレス実行中に変化してしまうと考えます。ですのでThreadArgsへは、値として渡して、freeは処理の最後で行われたらどうでしょうか。
1
+ 親モジュールの領域を更新スレッドですメモリをロック(mutex)する必要が有ると思います

2

変更

2016/12/23 04:23

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,1 +1,1 @@
1
- スレッドはフォークとは異なり親モジュールのコピーはされないので、親の領域のアドレスを渡すと、変化してしまうと考えます。ですので、ThreadArgsへは、値として渡して、freeは処理の最後で行われたらどうでしょうか。
1
+ スレッドはフォークとは異なり親モジュールのコピーはされないので、親の領域のアドレスを渡すと、実行中に変化してしまうと考えます。ですので、ThreadArgsへは、値として渡して、freeは処理の最後で行われたらどうでしょうか。

1

変更

2016/12/23 04:11

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,2 +1,1 @@
1
- 自環境でも結果正常したが気になるのは、 free(threadArgs);↲がwhile前に有る事
1
+ スレッドフォークとは異なり親モジュールのコピーはされないので、領域のアドレスを渡すと、変化してしまうと考えます。ですので、ThreadArgsへは、値として渡して、freeは処理最後行われたらどうでしょうか
2
- mallocした領域をwhileの前にfreeするのは、早い気がします。