/****************************************/
/*                                      */
/*  Prof. Dr. Carsten Vogt              */
/*  Fachhochschule Koeln                */ 
/*  Fakultaet 07, Nachrichtentechnik    */
/*  http://www.nt.fh-koeln.de/vogt      */
/*                                      */
/*  Linux-C-Schnittstelle mit pthreads: */
/*  Mutexe zur Durchsetzung des         */
/*   wechselseitigen Ausschlusses       */
/*                                      */
/****************************************/

// Unter Linux zu uebersetzen mit 'gcc -pthread ...' oder 'cc -pthread ...'

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

struct param {
 char kennung;
 int verzoegerung1;
 int verzoegerung2;
};

pthread_mutex_t mutex;

void *schleife(void *p)
{
   int i;
   struct param pp;
   pp = *((struct param *)p);
   for (i=0;i<3;i++) {
    pthread_mutex_lock(&mutex);
    printf("%c betritt kritischen Abschnitt\n",pp.kennung);
    sleep(pp.verzoegerung1);
    printf("%c verlaesst kritischen Abschnitt\n",pp.kennung);
    pthread_mutex_unlock(&mutex);
    sleep(pp.verzoegerung2);
   }
   pthread_exit(0);
}

int main (int argc, char *argv[])
{
   pthread_t t1,t2;
   struct param p1, p2;
   pthread_mutex_t mutex;
   int rc;

   rc = pthread_mutex_init(&mutex, NULL);
   printf("mutex_init(): return code = %d\n",rc);

   p1.kennung = 'A';
   p1.verzoegerung1 = 2;
   p1.verzoegerung2 = 3;
   pthread_create(&t1, NULL, schleife, &p1); 

   p2.kennung = 'B';
   p2.verzoegerung1 = 3;
   p2.verzoegerung2 = 1;
   pthread_create(&t2, NULL, schleife, &p2); 

   pthread_join(t1,NULL);
   pthread_join(t2,NULL);

   pthread_mutex_destroy(&mutex);

}


