New course! Every coder should learn Generative AI!
Try a free lesson+ 1
Have you seen the solution mentioned?
; From wikipedia, with a few edits to replace S, E and F.
; https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
semaphore S = 1;
semaphore E = 0;
semaphore F = BUFFER_SIZE;
procedure producer()
{
while (true)
{
item = produceItem();
down(F);
down(S);
putItemIntoBuffer(item);
up(S);
up(E);
}
}
procedure consumer()
{
while (true)
{
down(E);
down(S);
item = removeItemFromBuffer();
up(S);
up(F);
consumeItem(item);
}
}
If you swap down(F) and down(S) in the producer
Lets say the CPU executes as follows:
1. consumer executes down(E); E is locked so it has to wait for the release.
2. producer executes item = produceItem();
3. producer executes down(S); producer locks S.
4. producer executes down(F); F is decremented by 1, may or may not lock. Lets say it does lock, therefore F is 0.
5. producer executes putItemIntoBuffer(item);
6. producer executes up(S); S is now released.
7. producer executes up(E); E is now released, consumer is waiting for it.
8. consumer executes down(E); and locks E.
( consumer is feeling particularly slow today so producer is able to catch up with a few instructions )
9. producer executes item = produceItem();
10. producer executes down(S); and locks S.
11. producer executes down(F); F is 0, therefore it's locked. So producer has to wait. Only consumer can release it.
12. consumer executes down(S); S is locked, so consumer has to wait. Only producer can release it.
producer is waiting for F and consumer is waiting for S, only consumer can unlock F for producer to unlock S. Good job, you have a deadlock.