-
Notifications
You must be signed in to change notification settings - Fork 0
/
09-thread-array-sum.c
69 lines (55 loc) · 1.42 KB
/
09-thread-array-sum.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Run Using "gcc -pthread 09_thread_array_sum.c && ./a.out"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct array_index {
int* ptr;
int* arr;
int start;
int end;
} AI;
void* array_sum(void* vargp) {
AI* str = (AI*)vargp;
int* ptr = str -> ptr;
int* arr = str -> arr;
int start = str -> start;
int end = str -> end;
free(str);
for (int i=start; i<end; i++)
*ptr += arr[i];
return NULL;
}
int main() {
int t = 5;
pthread_t tid[t];
int result[t];
for (int i=0; i<t; i++)
result[i] = 0;
int n = 21;
int arr[n];
for (int i=0; i<n; i++)
arr[i] = i + 1;
int size = n/(t-1);
int last = n%(t-1);
for (int i=0; i<t; i++) {
// AI str; // Unexpected Result Because AI Gets Destroyed
AI* str = malloc(sizeof(AI));
str -> ptr = &result[i];
str -> arr = arr;
str -> start = size*i;
str -> end = (i == t-1) ? n : size*(i+1);
pthread_create(&tid[i], NULL, array_sum, (void*)str);
}
for (int i = 0; i < t; i++) {
pthread_join(tid[i], NULL);
}
for (int i=0; i<t; i++)
printf("result[%d] = %d\n", i, result[i]);
int sum = 0;
for (int i=0; i<t; i++)
sum += result[i];
printf("sum = %d\n", sum);
printf("result = %s\n", sum == n*(n+1)/2 ? "Pass" : "Fail");
return 0;
}