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 |