In the simple case given, unlocking in the reverse order is not necessary to avoid a deadlock.
However, as the code gets more complicated, unlocking in the reverse order helps you maintain proper lock ordering.
Consider:
A.lock();
B.lock();
Foo();
A.unlock();
Bar();
B.unlock();
If Bar()
attempts to reacquire A, you've effectively broken your lock ordering. You're holding B and then trying to get A. Now it can deadlock.
If you unlock in the reverse order style (which is very natural if you use RAII):
A.lock();
B.lock();
Foo();
B.unlock();
Bar();
A.unlock();
then it doesn't matter if Bar()
attempts to take a lock, as lock ordering will be preserved.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…