Both priority inheritance and priority ceiling protocols are used to minimise the consequences of a race condition. They both dynamically change the priority of tasks that hold a resource, needed for execution of a higher-priority task, which "unstucks" it.
What I cannot find in any literature is:
- How are their algorithms of changing a task priority different?
- In what situations one is preferable to another?