Date: Tue, 8 Apr 2014 12:58:53 -0400 From: vasanth sabavat <vasanth.raonaik@gmail.com> To: =?ISO-8859-2?Q?Edward_Tomasz_Napiera=B3a?= <trasz@freebsd.org> Cc: hackers@freebsd.org Subject: Re: Multiple locks and missing wakeup. Message-ID: <CAAuizBi3Av1ZPGw6gP6MFcoxgDq7ebh==QjqiY=wvHQ9eGcMMA@mail.gmail.com> In-Reply-To: <0D69A6A8-43D1-41FB-8C2D-00F5CAD9C86E@FreeBSD.org> References: <0D69A6A8-43D1-41FB-8C2D-00F5CAD9C86E@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, I assume you are in a situation where one of your lists is being accessed by many producer threads and only one thread is consuming both lists? In your context, wouldn't it be easier to use two separate threads to process each individual lists? This is assuming you want to avoid contention to one list which is accessed by many threads. On Tue, Apr 8, 2014 at 2:34 AM, Edward Tomasz Napiera=C5=82a <trasz@freebsd.org>wrote: > Let's say I have a kernel thread processing elements from a queue, > sleeping until there is work to do; something like this: > > mtx_lock(&mtx1); > for (;;) { > while (!LIST_EMPTY(&list1)) { > elt =3D LIST_FIRST(&list1); > do_stuff(elt); > LIST_REMOVE(&list1, elt); > } > sleep(&list1, &mtx1); > } > mtx_unlock(&mtx1); > > Now, is there some way to make it work with two lists, protected > by different mutexes? The mutex part is crucial here; the whole > point of this is to reduce lock contention on one of the lists. The > following code would result in a missing wakeup: > > mtx_lock(&mtx1); > for (;;) { > while (!LIST_EMPTY(&list1)) { > elt =3D LIST_FIRST(&list1); > do_stuff(elt); > LIST_REMOVE(&list1, elt); > } > > mtx_lock(&mtx2); > while (!LIST_EMPTY(&list2)) { > elt =3D LIST_FIRST(&list2); > do_other_stuff(elt); > LIST_REMOVE(&list2, elt); > } > mtx_unlock(&mtx2); > > sleep(&list1, &mtx1); > } > mtx_unlock(&mtx1); > > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org= " > --=20 Thanks, Vasanth
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAAuizBi3Av1ZPGw6gP6MFcoxgDq7ebh==QjqiY=wvHQ9eGcMMA>