Мой коллега попросил меня написать домашнее задание для него. Хотя это было не слишком этично, но я признал себя виновным.
Вот как выглядит проблема:
Напишите программу на C, в которой вычисляется последовательность 1 2 + 2 2 + ... + n 2 .
Предположим, что n кратно p и p - количество потоков.
Вот что я написал:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define SQR(X) ((X) * (X))
int n, p = 10, total_sum = 0;
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
/* Function prototype */
void *do_calc(void *arg);
int main(int argc, char** argv)
{
int i;
pthread_t *thread_array;
printf("Type number n: ");
fscanf(stdin, "%d", &n);
if (n % p != 0 ) {
fprintf(stderr, "Number must be multiple of 10 (number of threads)\n");
exit(-1);
}
thread_array = (pthread_t *) malloc(p * sizeof(pthread_t));
for (i = 0; i < p; i++)
pthread_create(&thread_array[i], NULL, do_calc, (void *) i);
for (i = 0; i < p; i++)
pthread_join(thread_array[i], NULL);
printf("Total sum: %d\n", total_sum);
pthread_exit(NULL);
}
void *do_calc(void *arg)
{
int i, local_sum = 0;
int thr = (int) arg;
pthread_mutex_lock(&mtx);
for (i = thr * (n / p); i < ((thr + 1) * (n / p)); i++)
local_sum += SQR(i + 1);
total_sum += local_sum;
pthread_mutex_unlock(&mtx);
pthread_exit(NULL);
}
Помимо логической / синтаксической точки зрения, мне было интересно:
- как будет работать соответствующая не многопоточная программа
- как я могу проверить / увидеть их производительность
- что бы программа без использования потоков
Заранее спасибо, и я с нетерпением жду ваших мыслей