Regions
With a semaphore you can implement mutual exclusion, but there is a possibility of priority inversion. Regions were invented to solve that issue.

A region is an INtime object that can provide exclusive access to a resource, such as a critical area of code, with priority inversion management. That is, when a thread possesses the region, its priority is optionally raised to that of the best (numerically lowest) priority thread waiting for the same region.