Очень грубое приближение: если ваш поток выполнения должен блокироваться, удерживая ресурс (т. Е. Mutex, sem), вы не должны использовать мьютекс. Проблема с этим приближением состоит в том, что блок означает что-то другое в программе UI и обработчике прерываний;блокировка - понятие относительное.
Мьютексы связаны с владельцами;Семафоров нет. Единственный агент, который может освободить мьютекс, это тот, кто его приобрел. Семафоры не имеют этого ограничения. Из-за этого ограничения, если агент с низким приоритетом блокирует агент с высоким приоритетом на мьютексе, супервизор (ядро, что угодно ...) может повысить приоритет владельца, пока он не откажется от него. Это может применяться транзитивно для решения нециклической инверсии приоритетов. Вы не можете сделать это с семафорами, поскольку у них нет понятия владельца.
Например, поток 1 может получить семафор, поток 2 может ожидать его, а поток 3 может отказаться от него. Это может звучать как хаос, но это может быть основой более сложной системы, где потоки 3 и 1 обмениваются данными с помощью некоторых средств, поэтому поток 1 может передать владение ресурсом непосредственно потоку 3. Это не может быть сделано с мьютексами.
Тем не менее;Я мог бы взломать pthread_mutex_transfer (mutex, pthread) в любую существующую реализацию, прикасаясь носом к пуристам и теоретикам.