Власний м’ютекс у C++11
Як запобігти інверсії пріоритету у програмі 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);
}
};