[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
mutex priority inheritance not transitive (in violation of posix?)
- Date: Fri, 25 Mar 2011 12:47:09 -0600
- From: strauman at slac.stanford.edu (Till Straumann)
- Subject: mutex priority inheritance not transitive (in violation of posix?)
While playing with mutexes (binary semaphores with priority-
inheritance) I found that priority-inheritance is not
transitive, i.e., if there is a chain of tasks (Ti) blocking on
M2 > held by > T2 > blocked on > M1 > held by T1
and a high priority thread T3 wants to acquire M2
then priority inheritance lifts T2's priority to
match T3's but this increase of priority is not propagated
on to T1.
While I understand that a implementation of transitive
semantics could be quite costly I believe that the
current limitation should be described in the documentation.
It also seems that the current behavior violates 1003.1
When a thread is blocking higher priority
threads because of owning one or more mutexes
with the PTHREAD_PRIO_INHERIT protocol
attribute, it shall execute at the higher of
its priority or the priority of the highest
priority thread waiting on any of the mutexes
owned by this thread and initialized with this
While this requirement was fulfilled when T2 tried
to take M1 (priority of T1 was lifted to T2's) it
is no longer met once T3 boosted T2's priority.
At that point T1 is no longer executing at the priority
of the highest priority thread waiting on M1.