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