Skip site navigation (1)Skip section navigation (2)
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>