diff --git a/content/notes/20-sync-deadlock.md b/content/notes/20-sync-deadlock.md index 5cc980937..5a7e9a9b7 100644 --- a/content/notes/20-sync-deadlock.md +++ b/content/notes/20-sync-deadlock.md @@ -12,8 +12,8 @@ tags: producer consumer problem issues -- no data in buffe: consumer has nothing to consume -- buffer is full: no space for producer to produce +- no data in buffe: consumer has nothing to consume: data race +- buffer is full: no space for producer to produce: busy waiting private vars - in: next pos in buf to be writted @@ -24,4 +24,32 @@ shared variables - counter: number of items in buffer waiting -- busy" \ No newline at end of file +- busy: proces keeps checking (if buffer is still full) wasting CPU time +- non busy: suspend the process + +soution with shared array +```c +PRODUCER: repeat + ... + produce an item in nextp + ... + while counter = n do no-op; + buffer[in] := nextp; + in := in+1 mod n; + counter := counter+1; + until false; +CONSUMER: repeat + while counter = 0 do no-op; + nextc := buffer[out]; + out := out+1 mod n; + counter := counter-1; + + ... + consume the item in nextc + ... + until false; +``` + +counter is a shared variable - causes a data race problem + +![data race problem slide|400](https://i.imgur.com/qIz6FGU.png)