Refactoring in chapters
This commit is contained in:
101
threads_chp4/ex421.c
Normal file
101
threads_chp4/ex421.c
Normal file
@@ -0,0 +1,101 @@
|
||||
#include <limits.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define OPERATIONS 3
|
||||
#define MIN(a, b) a > b ? b : a
|
||||
#define MAX(a, b) a < b ? b : a
|
||||
|
||||
void *min(void *);
|
||||
void *avg(void *);
|
||||
void *max(void *);
|
||||
|
||||
typedef void *(*pthread_fn_t)(void *);
|
||||
|
||||
typedef struct __THREAD_DATA__ {
|
||||
int *numbers;
|
||||
int size;
|
||||
} thread_data_t;
|
||||
|
||||
int minimum = INT_MAX;
|
||||
int maximum = INT_MIN;
|
||||
int average = 0;
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2) {
|
||||
perror("Usage: statistic NUMBERS...\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
const int size = argc - 1;
|
||||
int *numbers = (int *)calloc(size, sizeof(int));
|
||||
for (int i = 1; i < argc; i++) {
|
||||
numbers[i - 1] = atoi(argv[i]);
|
||||
}
|
||||
|
||||
const thread_data_t tdata = {.numbers = numbers, .size = size};
|
||||
const pthread_fn_t ops[OPERATIONS] = {min, max, avg};
|
||||
|
||||
pthread_attr_t attr;
|
||||
pthread_t threads[OPERATIONS];
|
||||
pthread_attr_init(&attr);
|
||||
for (size_t i = 0; i < OPERATIONS; i++) {
|
||||
pthread_create(&threads[i], &attr, ops[i], (void *)&tdata);
|
||||
}
|
||||
|
||||
for (int i = 0; i < OPERATIONS; i++) {
|
||||
pthread_join(threads[i], NULL);
|
||||
}
|
||||
|
||||
printf("Summary:\n");
|
||||
printf("The average value is %d\n", average);
|
||||
printf("The minimum value is %d\n", minimum);
|
||||
printf("The maximum value is %d\n", maximum);
|
||||
|
||||
free(numbers);
|
||||
numbers = NULL;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void *min(void *args) {
|
||||
const thread_data_t *tdata = (thread_data_t *)args;
|
||||
const int *numbers = tdata->numbers;
|
||||
const int size = tdata->size;
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
minimum = MIN(minimum, numbers[i]);
|
||||
}
|
||||
|
||||
pthread_exit(0);
|
||||
}
|
||||
|
||||
void *max(void *args) {
|
||||
const thread_data_t *tdata = (thread_data_t *)args;
|
||||
const int *numbers = tdata->numbers;
|
||||
const int size = tdata->size;
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
maximum = MAX(maximum, numbers[i]);
|
||||
}
|
||||
|
||||
pthread_exit(0);
|
||||
}
|
||||
|
||||
int sum(const int *values, const int n) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
sum += values[i];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
void *avg(void *args) {
|
||||
const thread_data_t *tdata = (thread_data_t *)args;
|
||||
const int *numbers = tdata->numbers;
|
||||
const int size = tdata->size;
|
||||
const int total = sum(numbers, size);
|
||||
average = total / size;
|
||||
pthread_exit(0);
|
||||
}
|
||||
Reference in New Issue
Block a user