First, make a minor change. Rename the shared variable as turn.
The idea would be (if it worked) that when turn is 0, thread 1 would wait.
When turn is 1, thread 0 would wait.
The code for the two threads would be modified to test turn like this:
| Thread 0 | Thread 1 |
|---|---|
0) for(i = 0; i < N; i++) {
1) while ( turn != 0 )
{
}
2) critical section
3) turn = 1;
4) remainder section
}
5)
|
0) for(j = 0; j < M; j++) {
1) while ( turn != 1 )
{
}
2) critical section
3) turn = 0;
4) remainder section
}
5)
|
Although this would solve the synchronization problem where the two threads must alternate, it would not solve the critical section problem as it would violate the progress requirement.