~za08gywo

Übung 04 - Threads, Koordinierung

Published at 03.06.2025

Die Semaphore Implementierungen für die mach sind im cip unter /proj/i4sp1/pub/aufgabe4/sem* zu finden

threads mit valgrind debuggen

Mit valgrind --tool=helgrind --track-lockorders=yes --show-error-list=yes können Wettlaufsituationen erkannt werden und debuggen erleichtert werden :)

Beispiel Programme aus der Präsenzübung

sum_row.c - fixed code snippet aus den Übungsfolien

#include "sem.h"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define SIZE 100

struct param {
  int index;
  SEM *sem;
};

static void *sumRow(void *arg);

static double a[SIZE][SIZE], sum;

int main(int argc, char *argv[]) {
  // seed rng and fill array with numbers
  srand(42);
  for (int i = 0; i < SIZE; i++) {
    for (int j = 0; j < SIZE; j++) {
      a[i][j] = rand();
    }
  }

  // create Semaphore
  SEM *s1 = semCreate(1);
  if (s1 == NULL) {
    perror("semCreate");
    exit(EXIT_FAILURE);
  }

  // allocate memory for thread ids and their arguments
  pthread_t tids[SIZE];
  struct param args[SIZE];

  // start threads
  for (int i = 0; i < SIZE; i++) {
    args[i].index = i;
    args[i].sem = s1;
    pthread_create(&tids[i], NULL, sumRow, &args[i]);
  }

  // wait for threads to finish execution
  for (int i = 0; i < SIZE; i++)
    pthread_join(tids[i], NULL);

  // clean up memory
  semDestroy(s1);

  printf("%f\n", sum);
  return 0;
}

static void *sumRow(void *arg) {
  struct param *par = arg;
  double localSum = 0;
  for (int j = 0; j < SIZE; j++)
    localSum += a[par->index][j];

  /* START KRITISCHER ABSCHNITT */
  down(par->sem);
  sum += localSum;
  up(par->sem);
  /* ENDE KRITISCHER ABSCHNITT */

  return NULL;
}