Posted on

Table of Contents

Übung 4

POSIX-Threads, Koordinierung mit Semaphoren

FolienAufgabe

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>

/* Don't let any student know about this... */
#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]);  // TODO: Fehlerbehandlung
    }
    for (int i = 0; i < N; i++) {
        pthread_join(tids[i], NULL);  // TODO: Fehlerbehandlung
    }

    semDestroy(sem);

    printf("%lf\n", sum);

    return EXIT_SUCCESS;
}