|
Boost : |
From: Ben Hutchings (ben.hutchings_at_[hidden])
Date: 2004-09-16 09:05:40
James Ahlborn <james.ahlborn_at_[hidden]> wrote:
> > Ben Hutchings <ben.hutchings <at> businesswebsoftware.com> writes:
>
> > I don't believe so. If waiting for a condition releases the mutex
> > only once, this can result in deadlock, and if it releases the mutex
> > completely the protected data can be seen while its invariant is
> > broken. There seems to be no right way to use recursive mutexes
> > with condition variables.
>
> umm, using a condition fundamentally implies releasing a mutex and
> then reacquiring it. regardless of the mutex type, one needs to make
> sure that the invariants are valid when the mutex is released.
Yes, I understand all this.
<snip>
> > I think you should avoid using recursive mutexes. Read
> > <http://groups.google.com/groups?selm=3434E6BA.ABD%40zko.dec.com>.
>
> well, i've programmed significantly in both java and c++ and i think
> the poster of that comment is mistaken on many fronts. besides the
> obvious bias against java and the seemingly minimal knowledge of how
> "synchronized" works in java,
"Minimal knowledge"? Does that mean you think he's wrong in fact, or
that his opinion about its usefulness is mistaken?
> i think the fundamental argument of a recursive mutex being the "lazy
> man's mutex" is wrong. In any moderately complex system, trying to
> avoid using recursive mutexes adds complexity to the overall design
> and eventually breaks the modularity of the system.
As I understand it, your reason for using a recursive mutex would be
that there are functions that require a weaker invariant and may
safely be called from a function that holds the mutex and has broken
the normal invariant, but may also be called without the mutex being
held. (If a function requires the normal invariant then you need
to re-establish that before calling it, and having done so you could
safely unlock the mutex, removing the need for it to be recursive.)
This means that responsibility for re-establishing the normal
invariant for a recursive mutex is divided up between several
functions. So how can the single function that waits on the
condition re-establish the invariant? Wouldn't that require a gross
breach of the modularity you want?
<snip>
> to return to boost specifically, the implementation of
> recursive_mutex and condition seem to imply their combined use. I
> see no documentation which says "hey, you should only use condition
> with a normal mutex", nor any compiler error when i try to do so.
> i see no "fundamental" reason why a recursive mutex and a condition
> should not work together (they are quite happy in java).
I do.
> yet, they don't work, and I'm wondering if that is intended or a
> bug in boost.
It looks like a documentation bug to me.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk