Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* This programm implements the Dekker Algo.
- *
- * gcc -o aufgabe_5_1_a aufgabe_5_1_a.c parallel.c -lpthread
- *
- * File: aufgabe_5_1_a.c Author: S. Grau
- * Date: 16.12.2008
- *
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <assert.h>
- #include "parallel.h"
- #define NUM_THR 2
- volatile int flag0 = 0;
- volatile int flag1 = 0;
- volatile int turn = 0;
- void worker0 (void);
- void worker1 (void);
- int main (void)
- {
- ThrID_t thr_id [NUM_THR];
- thr_id[0] = parallel ((PtrFunc_t) worker0, 0);
- thr_id[1] = parallel ((PtrFunc_t) worker1, 1);
- join_all (thr_id, NUM_THR);
- return 0;
- }
- void worker0 (void)
- {
- for (;;)
- {
- /* unkritische Arbeit */
- printf ("worker0: doing some normal work\n");
- flag0 = 1;
- while (flag1 == 1)
- {
- if (turn != 0) /* Prozess 2 bekommt Vorrang */
- {
- flag0 = 0; /* Auf kritischen Abschnitt
- verzichten */
- while (turn != 0) /* Auf Prozess 2 warten */
- {
- ;
- }
- flag0 = 1; /* Neuer Versuch */
- }
- }
- /* kritische Arbeit */
- printf ("worker0: doing some critical work\n");
- sleep (1);
- printf ("worker0: leaving critical area now\n");
- turn = 1;
- flag0 = 0;
- }
- }
- void worker1(void)
- {
- for (;;)
- {
- /* Unkritische Arbeit */
- printf ("worker1: doing some normal work\n");
- flag1 = 1;
- while (flag0 == 1)
- {
- if (turn != 1) /* Prozess 1 bekommt Vorrang */
- {
- flag1 = 0; /* Auf kritischen Abschnitt
- verzichten */
- while (turn != 1) /* Auf Prozess 1 warten */
- {
- ;
- }
- flag1 = 1; /* Neuer Versuch */
- }
- }
- /* Kritische Arbeit */
- printf ("worker1: doing some critical work\n");
- sleep(1);
- printf ("worker1: leaving critical area now\n");
- turn = 0;
- flag1 = 0;
- }
- }
Add Comment
Please, Sign In to add comment