Отсутствует вызов pthread_mutexattr_init
.
PTHREAD_PRIO_PROTECT
означает:
Когда поток владеет одним или несколькими не- устойчивые мьютексы, инициализированные протоколом PTHREAD_PRIO_PROTECT, , он должен выполняться с наивысшим из его приоритета или наивысшим из верхних пределов приоритета всех ненадежных мьютексов, принадлежащих этому потоку и инициализированных этим атрибутом, независимо от того, другие потоки заблокированы на любом из этих ненадежных мьютексов или нет.
Это означает, что pthread_mutex_lock
устанавливает приоритет текущего потока на max(current_priority, prioceiling)
. Ваш prioceiling
- 99, и для такого приоритета требуется поток с классом планирования в реальном времени (FIFO или циклический).
Фактически, любой приоритет для pthread_mutexattr_setprioceiling
требует класса планирования в реальном времени:
Значения prioceiling
находятся в максимальном диапазоне приоритеты определены SCHED_FIFO
.
Это потому, что функции, которые вы хотите использовать, принадлежат POSIX расширениям реального времени , а класс планирования по умолчанию SCHED_OTHER
- для :
Эта политика определена для того, чтобы разрешить строго соответствующим приложениям иметь возможность переносным образом указывать, что им больше не нужна политика планирования в реальном времени.
Если вы запускаете свое приложение с sudo chrt --fifo 1 <app>
, оно назначает вашему процессу класс планирования FIFO с приоритетом 1, что позволяет ему успешно блокировать мьютекс при первом вызове.
Относительно того, почему второй вызов завершается успешно, когда 1-й не работает, это кажется недокументированным поведением, если я не ошибаюсь, и , вероятно, ошибка в glib c.