Sololearn: Learn to Code
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.
7th Nov 2019, 10:08 PM
Dennis
Dennis - avatar