Guest User

Untitled

a guest
Feb 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. /* This programm implements the Dekker Algo.
  2. *
  3. * gcc -o aufgabe_5_1_a aufgabe_5_1_a.c parallel.c -lpthread
  4. *
  5. * File: aufgabe_5_1_a.c Author: S. Grau
  6. * Date: 16.12.2008
  7. *
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <time.h>
  12. #include <assert.h>
  13. #include "parallel.h"
  14.  
  15. #define NUM_THR 2
  16.  
  17. volatile int flag0 = 0;
  18. volatile int flag1 = 0;
  19. volatile int turn = 0;
  20.  
  21.  
  22. void worker0 (void);
  23. void worker1 (void);
  24.  
  25. int main (void)
  26. {
  27. ThrID_t thr_id [NUM_THR];
  28.  
  29. thr_id[0] = parallel ((PtrFunc_t) worker0, 0);
  30. thr_id[1] = parallel ((PtrFunc_t) worker1, 1);
  31.  
  32. join_all (thr_id, NUM_THR);
  33.  
  34. return 0;
  35. }
  36.  
  37. void worker0 (void)
  38. {
  39. for (;;)
  40. {
  41.  
  42. /* unkritische Arbeit */
  43. printf ("worker0: doing some normal work\n");
  44.  
  45. flag0 = 1;
  46. while (flag1 == 1)
  47. {
  48. if (turn != 0) /* Prozess 2 bekommt Vorrang */
  49. {
  50. flag0 = 0; /* Auf kritischen Abschnitt
  51. verzichten */
  52.  
  53. while (turn != 0) /* Auf Prozess 2 warten */
  54. {
  55. ;
  56. }
  57.  
  58. flag0 = 1; /* Neuer Versuch */
  59. }
  60. }
  61.  
  62. /* kritische Arbeit */
  63. printf ("worker0: doing some critical work\n");
  64. sleep (1);
  65. printf ("worker0: leaving critical area now\n");
  66.  
  67. turn = 1;
  68. flag0 = 0;
  69. }
  70. }
  71.  
  72. void worker1(void)
  73. {
  74. for (;;)
  75. {
  76. /* Unkritische Arbeit */
  77. printf ("worker1: doing some normal work\n");
  78.  
  79. flag1 = 1;
  80.  
  81. while (flag0 == 1)
  82. {
  83. if (turn != 1) /* Prozess 1 bekommt Vorrang */
  84. {
  85. flag1 = 0; /* Auf kritischen Abschnitt
  86. verzichten */
  87.  
  88. while (turn != 1) /* Auf Prozess 1 warten */
  89. {
  90. ;
  91. }
  92.  
  93. flag1 = 1; /* Neuer Versuch */
  94. }
  95. }
  96.  
  97. /* Kritische Arbeit */
  98. printf ("worker1: doing some critical work\n");
  99. sleep(1);
  100. printf ("worker1: leaving critical area now\n");
  101.  
  102. turn = 0;
  103. flag1 = 0;
  104. }
  105. }
Add Comment
Please, Sign In to add comment