Як запобігти інверсії пріоритету у програмі POSIX? Pthread дозволяє вибрати протокол PTHREAD_PRIO_INHERIT для м’ютексу. А як цим скористатися у стандартному м’ютексі бібліотеки С++?

Видається цілком прийнятним вивести власний м’ютекс від std::mutex, переініціалізувавши в його основі м’ютекс POSIX у конструкторі. Це не переносний розв’язок, але стійкість програми понад усе:

class InheritPrioMutex : public std::mutex
{
    InheritPrioMutex()
    {
        // Знищити робочий м’ютекс
        ::pthread_mutex_destroy(native_handle());

        // Створити атрибут з потрібним протоколом
        ::pthread_mutexattr_t attr;
        ::pthread_mutexattr_init(&attr);
        ::pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
        // Ініціалізувати робочий м’ютекс
        ::pthread_mutex_init(native_handle(), &attr);
        // Атрибут більше не потрібний
        ::pthread_mutexattr_destroy(&attr);
    }
};