The first example is simple, but
important -- the algorithm detects a deadlock for the most basic of
cases. Node A continually tries to write 2 samples to queue Q, and node
B
continually tries to read 2 samples from Q. Q starts with a capacity of
only 1. We know that until Q has a capacity of 2, A cannot write the 2
tokens. This
example shows that the D4R algorithm detects that Q is too small, and
causing an artificial deadlock.
 |
Node A()
{ while (true) Q.put(2); }
Node B() { while (true) Q.get(2); }
|
Note that this is not the only possible order of node executions, but
that all
orders will eventually lead to Q being lengthened.
The second example is more complicated, and illustrates an artificial
deadlock
containing 3 nodes. Queue Q must grow to size 2
before the program can function normally. Again, this example
demonstrates that this problem is detected and resolved.

|
Node A()
{while (true) { Q.put(2); Q.put(1); }}
Node B() {while (true) { P.get(1); R.put(1); }}
Node C() {while (true) { R.get(1); Q.get(2); }}
|
Again, the nodes could have executed in many different orders -- this
order is one possible execution order. Note that step 6, node C knows
that a deadlock exists, however the culpable queue is not located until
step 7.