This handout presents several proposed solutions to the 2 process critical section problem, and analyzes them. In these solutions, one process is numbered 0 and the other is numbered 1. The variable i holds the number corresponding to the process executing the code, and the variable j holds the number corresponding to the other process. All the code shown is shared by both processes, but the variables i and j hold different values.
Here, turn contains the number of the process whose turn it is to execute the critical section.
1 int turn; /* entry section */ 2 while (turn != i) 3 /* do nothing * / ; /* critical section */ ... /* exit section */ 4 turn = j;
Here, inCS[0] is true when process 0 is in the critical section, and false otherwise. A similar statement holds for inCS[1].
1 int inCS[2] = { 0, 0 }; /* entry section */ 2 while (inCS[j]) 3 /* do nothing * / ; 4 inCS[i] = 1; /* critical section */ ... /* exit section */ 5 inCS[i] = 0;
Here, interested[0] is true when process 0 wants to enter the critical section, and false otherwise. A similar statement holds for interested[1].
1 int interested[2] = { 0, 0 }; /* entry section */ 2 interested[i] = 1; 3 while (interested[j]) 4 /* do nothing * / ; /* critical section */ ... /* exit section */ 5 interested[i] = 0;
This combines the first and third proposed solutions.
1 int interested[2]; = { 0, 0 }; 2 int turn; /* entry section */ 3 interested[i] = 1; 4 turn = j; 5 while (interested[j] && turn == j) 6 /* do nothing * / ; /* critical section */ ... /* exit section */ 7 interested[i] = 0;
You can also obtain a PDF version of this. | Version of April 7, 2008 at 11:00 AM |