Date: Fri, 6 Feb 2004 13:49:43 -0500 From: John Baldwin <jhb@FreeBSD.org> To: popsong old <oldpopsong@yahoo.com> Cc: freebsd-current@freebsd.org Subject: Re: three locks and lock order reversal? Message-ID: <200402061349.43213.jhb@FreeBSD.org> In-Reply-To: <20040206020616.12702.qmail@web60606.mail.yahoo.com> References: <20040206020616.12702.qmail@web60606.mail.yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 05 February 2004 09:06 pm, popsong old wrote: > > If one thread does A then B, another thread does B then C, and a third > > thread does C then A you can deadlock if each thread gets the first lock > > and blocks on the second lock. Thread 1 wants B and holds A, thread 2 > > holds B and wants C, and thread 3 wants A and holds C. Thread 3 will not > > giveup C until it gets A. Thread 1 holds A and won't give it up until it > > gets B. Thread 2 holds B and won't give it up until it gets C which is > > held by thread 3. Hence, deadlock. > > > > -- > > John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ > > "Power Users Use the Power to Serve" = http://www.FreeBSD.org > > Thank you for the explanation! I only thought of two threads. So this bring > me another question: if the machine only have 2 CPUs, does it mean that > this kind of LOR is safe, provided there is no other sleep lock between A > and B, B and C, C and A? Default mutexes block instead of spin when they are contested, so you can have a deadlock on a UP machine like so: Thread 1 locks A and is preempted by an interrupt. Thread 2 gets to run before thread 1, locks B, and is preempted by an interrupt. Thread 3 runs next, locks C, and blocks on A. It lends its priority to thread 1 which then runs next and blocks on B. Thread 2 then gets max(thread1, thread3)'s priority and blocks on C. Now you are deadlocked on a UP machine. -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200402061349.43213.jhb>