質問編集履歴
3
メモリの解放について改善
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
ソースコードの誤りの訂正
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
排他処理を追加しました。追加質問内容と実行例について加筆しました。
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
|
実行環境
|