Files
Fabio Scotto di Santolo 3c4b9bdc56 Renaming folders
2024-09-11 10:47:59 +02:00

102 lines
2.1 KiB
C

#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);
}