misc/24641: pthread_rwlock_rdlock can deadlock

Earl Chew earl_chew at agilent.com
Mon Jan 5 17:03:33 PST 2004


Daniel Eischen wrote:
> POSIX says that:
> 
>   If the Thread Execution Scheduling option is supported, and
>   the threads involved in the lock are executing with the scheduling
>   policies SCHED_FIFO or SCHED_RR, the calling thread shall not
>   acquire the lock if a writer holds the lock or if writers of
>   higher or equal priority are blocked on the lock; otherwise,
>   the calling thread shall acquire the lock.

Call this P1.

> Forget about the writer's priority for a moment; we don't
> currently honor that.  And FYI, SCHED_OTHER in FreeBSD is
> SCHED_RR.
> 
> POSIX also says that:
> 
>   A thread may hold multiple concurrent read locks on rwlock (that
>   is, successfully call the pthread_rwlock_rdlock() function n
>   times). If so, the application shall ensure that the thread
>   performs matching unlocks (that is, it calls the
>   pthread_rwlock_unlock() function n times).

Call this P2.

I interpret P2 as requiring rdlock() to be recursive. That is, once
a thread acquires a rdlock(), it can do so repeatedly, as long as it
performs the correct number of matching unlocks().

I interpret P1 as giving wrlock()s preference over rdlocks() for
a particular lock.

> It isn't clear to me that this means that a subsequent rdlock
> request while there are writers blocked on the lock succeeds.

Hmm... reading P2 again, I can see how you could be right.

However, it appears counter-intuitive to me that if a thread has already
acquired a rdlock(), and the rdlock() is recursive, that a subsequent
call should fail.

Failure should indicate that the lock could not be acquired. But the
thread _already_ has the lock! So it's hard to explain why the
subsequent call should fail (given the requirement that the
rdlock be recursive).

> It may seem trivial to implement this, but when you consider
> that there may be a lot of readers then it is not so trivial.
> In order to implement it, you need to know whether a thread
> owns the rdlock and have a recurse count for it.

Hmm... doesn't P2 already require you to support recursion?

> And threads
> may own multiple read locks.  You would have to track all
> of them and it would add a bit of overhead having to search
> the owned read locks (and they don't have to be taken and
> released in order so you'd have to search the entire queue).

I don't see how either P1 or P2 requires this behaviour. What am
I missing?

Earl



More information about the freebsd-threads mailing list