code_junkie

Mutual Exclusion Problem

Nov 13th, 2011
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. boolean blocked[2];
  2. int turn;
  3. void P(int id) {
  4. while(true) {
  5. blocked[id] = true;
  6. while(turn != id) {
  7. while(blocked[1-id])
  8. /* do nothing */;
  9. turn = id;
  10. }
  11. /* critical section */
  12. blocked[id] = false;
  13. /* remainder */
  14. }
  15. }
  16. void main() {
  17. blocked[0] = false;
  18. blocked[1] = false;
  19. turn = 0;
  20. parbegin(P(0), P(1)); //RUN P0 and P1 parallel
  21. }
  22.  
  23. blocked = {false, false};
  24. turn = 0;
  25.  
  26. blocked[id] = false; // Not yet executed.
  27.  
  28. blocked {false, true}
  29. turn = 0;
  30.  
  31. turn= 1;
  32. blocked = {false, false};
  33.  
  34. P0: while (true) {
  35. P0: blocked[0] = true;
  36. P0: while (turn != 0) {
  37. P0: while (blocked[1]) {
  38. P0: }
  39. P1: while (true) {
  40. P1: blocked[1] = true;
  41. P1: while (turn != 1) {
  42. P1: }
  43. P1: criticalSection(P1);
  44. P0: turn = 0;
  45. P0: while (turn != 0)
  46. P0: }
  47. P0: critcalSection(P0);
  48.  
  49. get blocked[0] -> false // cpu 0
  50. set blocked[0] = true // cpu 1 (stored in CPU 1's L1 cache)
  51. get blocked[0] -> false // cpu 0 (retrieved from CPU 0's L1 cache)
  52. get glocked[0] -> false // cpu 2 (retrieved from main memory)
Add Comment
Please, Sign In to add comment