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 |