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

質問編集履歴

3

メモリの解放について改善

2016/12/23 04:28

投稿

johejo
johejo

スコア12

title CHANGED
File without changes
body CHANGED
@@ -105,14 +105,14 @@
105
105
  sum = ((struct ThreadArgs *) threadArgs) -> sum;
106
106
  count_num = ((struct ThreadArgs *) threadArgs) -> count_num;
107
107
  thread_id = ((struct ThreadArgs *) threadArgs) -> thread_id;
108
-
109
- free(threadArgs);
110
108
 
111
109
  while ( *sum < *count_num) {
112
110
  (*n)++;
113
111
  printf("Thread%d %d\n", thread_id, *n);
114
112
  for (i = 0; i < 50000000; i++) {}
115
113
  }
114
+
115
+ free(threadArgs);
116
116
  }
117
117
 
118
118
  int main(int argc, char *argv[])
@@ -180,9 +180,12 @@
180
180
 
181
181
  printf("%.3f[sec]\n", diff);
182
182
 
183
+ free(top);
184
+
183
185
  return 0;
184
186
  }
185
187
 
188
+
186
189
  ```
187
190
 
188
191
  ##追加の質問内容

2

ソースコードの誤りの訂正

2016/12/23 04:28

投稿

johejo
johejo

スコア12

title CHANGED
File without changes
body CHANGED
@@ -83,6 +83,10 @@
83
83
  #include <string.h>
84
84
  #include <pthread.h>
85
85
 
86
+ static pthread_mutex_t MyMutex=PTHREAD_MUTEX_INITIALIZER;
87
+
88
+ void *thread_func(void *threadArgs);
89
+
86
90
  struct ThreadArgs
87
91
  {
88
92
  int *count_num;
@@ -91,8 +95,6 @@
91
95
  int thread_id;
92
96
  };
93
97
 
94
- void *thread_func(void *threadArgs);
95
-
96
98
  void *thread_func(void *threadArgs) {
97
99
  int i, thread_id;
98
100
  int *n, *count_num, *sum;

1

排他処理を追加しました。追加質問内容と実行例について加筆しました。

2016/12/23 04:24

投稿

johejo
johejo

スコア12

title CHANGED
File without changes
body CHANGED
@@ -15,6 +15,66 @@
15
15
 
16
16
  勉強中の拙いソースコードですが、なぜこのようなことが起こるのか教えていただけないでしょうか。
17
17
 
18
+ #実行例について
19
+ スレッド数4で実行した場合
20
+ $./a.out 100 4
21
+ begin 100 4
22
+ Thread0 1
23
+ Thread1 1
24
+ Thread2 1
25
+ Thread3 1
26
+ Thread3 2
27
+ Thread1 2
28
+ Thread2 2
29
+ Thread0 2
30
+ Thread1 3
31
+ Thread3 3
32
+ Thread2 3
33
+ Thread0 3
34
+ ===中略===
35
+ Thread3 24
36
+ Thread1 24
37
+ Thread2 24
38
+ Thread0 24
39
+ Thread3 25
40
+ Thread1 25
41
+ Thread0 25
42
+ Thread2 25
43
+ sum 100
44
+ 12.109[sec]
45
+
46
+ スレッド数5で実行した場合
47
+ $./a.out 100 5
48
+ begin 100 5
49
+ Thread0 1
50
+ Thread1 1
51
+ Thread2 1
52
+ Thread3 1
53
+ Thread1 2
54
+ Thread3 2
55
+ Thread0 2
56
+ Thread2 2
57
+ Thread1 3
58
+ Thread3 3
59
+ Thread0 3
60
+ Thread2 3
61
+ ===中略===
62
+ Thread1 95
63
+ Thread3 95
64
+ Thread2 96
65
+ Thread0 97
66
+ Thread1 96
67
+ Thread3 96
68
+ Thread2 97
69
+ Thread0 98
70
+ Thread1 97
71
+ Thread4 1
72
+ Thread3 97
73
+ Thread2 98
74
+ sum 391
75
+ 38.390[sec]
76
+
77
+
18
78
  ###該当のソースコード
19
79
  ```C
20
80
  #include <stdio.h>
@@ -103,9 +163,11 @@
103
163
  }
104
164
 
105
165
  while (sum < count_num) {
166
+ pthread_mutex_lock(&MyMutex);
106
167
  for (i = 0, sum = 0, n = top; i < thread_num; i++, n++) {
107
168
  sum += *n;
108
169
  }
170
+ pthread_mutex_unlock(&MyMutex);
109
171
  //printf("%d %d\n", sum, count_num);
110
172
  }
111
173
  printf("sum %d\n", sum);
@@ -121,6 +183,11 @@
121
183
 
122
184
  ```
123
185
 
186
+ ##追加の質問内容
187
+ なぜスレッド数5の実行例では、Thread 4(5つめのスレッド)がすぐに開始されないのでしょうか。
188
+ ##追記
189
+ 排他処理を追加しました。
190
+ 追加の質問内容と実行例について加筆しました。
124
191
 
125
192
  ###補足情報(言語/FW/ツール等のバージョンなど)
126
193
  実行環境