Advertisement
kish-dev

black_white_bakery_alg

May 2nd, 2022
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. #define n_proc 10 /* Число конкурирующих процессов */
  2. #define n 9 /* Число для индексации массива */
  3.  
  4. mtype = { black, white };
  5.  
  6. bool choosing[n] = false;
  7. mtype color[n] = black;
  8. int TURN[n] = 0;
  9. mtype cur_color = black;
  10. int mult = 1;
  11.  
  12. inline max(i, temp, j, max_number) {
  13. do
  14. ::j < n_proc ->
  15. if
  16. ::color[j] == color[i] ->
  17. if
  18. ::TURN[j] > max_number ->
  19. max_number = TURN[j];
  20.  
  21. fi;
  22. fi
  23. od;
  24. temp = 1 + max_number;
  25. }
  26.  
  27. inline unlock(i) {
  28. if
  29. ::color[i] == black ->
  30. cur_color = white;
  31. ::else ->
  32. cur_color = black;
  33. fi;
  34. }
  35.  
  36. inline lock(i, temp, j, max_number, pointer_j) {
  37. choosing[i] = true;
  38. color[i] = cur_color;
  39.  
  40. max(i, temp, pointer_j, max_number);
  41. TURN[i] = 1 + temp;
  42. choosing[i] = false;
  43. do
  44. ::j < n ->
  45. if
  46. ::choosing[j] == false ->
  47. if
  48. ::color[i] == color[j] ->
  49. ((TURN[j] != 0) && ((TURN[j] < TURN[i]) && (j < i)) && (color[j] == color[i]));
  50. ::else ->
  51. (TURN[j] != 0 && (color[i] == cur_color) && color[j] != color[i]);
  52. fi;
  53. ::else -> skip;
  54. fi;
  55.  
  56. j = j + 1;
  57. od;
  58.  
  59. }
  60.  
  61. active[n] proctype proc() {
  62. int temp = 0;
  63. int j = 0;
  64. int max_number = -1;
  65. int pointer_j = 0;
  66. lock(_pid, temp, j, max_number, pointer_j);
  67.  
  68. mult = mult * 31;
  69. assert(mult == 31);
  70. mult = mult / 31;
  71. unlock(_pid);
  72.  
  73. }
  74.  
  75.  
  76.  
  77.  
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement