Sometimes you need to lock several resources. If you don’t take great care you are likely to get yourself into dead-locks. A simple example with just two lockable resources A and B:
function foo { lock A; lock B; // Do something with A and B unlock A; unlock B; } function bar { lock B; lock A; // Do something different with A and B unlock B; unlock A; }
When foo
and bar
are called at about the same time then there is the change that foo
locks A and bar
locks B which will make bar
wait on foo
‘s lock on A and vice versa.
Solution: fixed order on memory address
The simplest way to get rid of the deadlock is to always try to acquire a lock on A before on B. A generic solution would be to always lock the resource with the lowest memory address first.
This only works when memory addresses are fixed or that there is an otherwise fixed order-able property.