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

回答編集履歴

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するのは、早い気がします。