[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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
mutexes (Mj)

      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
(from
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutexattr_setprotocol.html)

   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
   protocol.

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.

-- Till