Übung 4
POSIX-Threads, Koordinierung mit Semaphoren
Folien ⨳ Aufgabe
Beispiel
In den Übungsfolien war ein Programm zum parallelen Berechnen von Zeilensummen in einer Matrix gegeben. Jedoch fehlte der Implementierung sämtliche Synchronisation. Aufgabe war es nun die nötige Synchronisation mit Semaphore einzufügen.
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "sem.h"
#define N 10000
static double a[N][N], sum;
struct param {
int index;
SEM *sem;
};
static void initialize_array(void) {
srand(0);
for (size_t i = 0; i < N; i++) {
for (size_t j = 0; j < N; j++) {
a[i][j] = ((double) rand()) / RAND_MAX;
}
}
}
static void *sumRow(void *arg) {
struct param *par = arg;
double localSum = 0;
for (size_t j = 0; j < N; j++) {
localSum += a[par->index][j];
}
P(par->sem);
sum += localSum;
V(par->sem);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t tids[N];
struct param args[N];
initialize_array();
SEM* sem = semCreate(1);
if (sem) {
perror("semCreate");
exit(EXIT_FAILURE);
}
for (int i = 0; i < N; i++) {
args[i].index = i;
args[i].sem = sem;
pthread_create(&tids[i], NULL, sumRow, &args[i]); }
for (int i = 0; i < N; i++) {
pthread_join(tids[i], NULL); }
semDestroy(sem);
printf("%lf\n", sum);
return EXIT_SUCCESS;
}