Spin locks
Before starting to talk about the condition variables and the true way that the sleep/notify technique should get implemented, let's go back a little bit and use busy-waiting together with mutexes to write a new solution for example 14.6. As a reminder, the example was about having first A and then B printed in the standard output.
The following is the proposed solution that uses a mutex equipped with the spin locking algorithm. The mutex acts as a memory barrier, so we won't have any memory visibility issues, and it effectively synchronizes the tasks P and Q over the Done shared flag:
Concurrent System {
Shared State {
Done : Boolean = False
M : Mutex
}
Task P {
1.1. print 'A'
1.2. SpinLock(M)
1.2. Done = True
1.3. SpinUnlock(M)
}
Task Q {
2.1 SpinLock(M)
2.2. While Not Done {
2.3. SpinUnlock(M)
2.4. SpinLock(M)
2.5. }
2.6. SpinUnlock(M)
2.4. print...