/****************************************/ /* */ /* Prof. Dr. Carsten Vogt */ /* TH Koeln, Fakultaet IME */ /* http://www.nt.th-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 #include #include #include 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); }