Стараюсь не звучать глупо, но не могу с собой поделать.
Ваш вопрос должен быть в чем разница между мьютексом и семафором?
И если быть более точным, вопрос должен звучать так: «Какова взаимосвязь между мьютексом и семафорами?»
(Я бы добавил этот вопрос, но я уверен на сто процентов, что какой-то чрезмерно усердный модератор закроет его как дубликат, не понимая разницы между разницей и отношениями.)
В терминологии объектов мы можем наблюдать, что:
наблюдение.1 Семафор содержит мьютекс
наблюдение.2 Мьютекс не является семафором, а семафор не является мьютексом.
Есть некоторые семафоры, которые будут действовать как мьютексы, называемые двоичными семафорами, но они чертовски НЕ мьютекс.
Существует специальный ингредиент под названием Сигнализация (для этого имени posix использует condition_variable), необходимый для создания Семафора из мьютекса.
Думайте об этом как об источнике уведомлений. Если два или более потоков подписаны на один и тот же источник уведомлений, то можно разослать им сообщение либо ОДНОМУ, либо ВСЕМ для пробуждения.
Может быть один или несколько счетчиков, связанных с семафорами, которые защищены мьютексом. Самый простой сценарий для семафора, есть один счетчик, который может быть 0 или 1.
Это - то, где беспорядок льется как муссонный дождь.
Семафор со счетчиком, который может быть 0 или 1, НЕ является мьютексом.
Mutex имеет два состояния (0,1) и одно владение (задание).
Семафор имеет мьютекс, несколько счетчиков и условную переменную.
Теперь, используйте свое воображение, и каждая комбинация использования счетчика и времени для подачи сигнала может создать один вид семафора.
Единственный счетчик со значением 0 или 1 и сигнализирующий, когда значение переходит в 1 И затем разблокирует одного из парней, ожидающих сигнала == Двоичный семафор
Один счетчик со значением от 0 до N и сигнализирует, когда значение становится меньше N, и блокируется / ждет, когда значения N == Подсчет семафора
Одиночный счетчик со значением от 0 до N, сигнализирующий, когда значение переходит в N, и блокирующий / ожидающий, когда значения меньше N == Семафор с барьером (хорошо, если они его не вызывают, тогда они должны.)
Теперь к вашему вопросу, когда что использовать. (ИЛИ скорее верный вопрос версии 3, когда использовать мьютекс и когда использовать двоичный семафор, поскольку нет сравнения с не двоичным семафором.)
Используйте мьютекс, когда
1. вам нужно настраиваемое поведение, которое не обеспечивается двоичным семафором, например, спин-блокировка, быстрая блокировка или рекурсивная блокировка.
Обычно вы можете настроить мьютексы с помощью атрибутов, но настройка семафора - это не что иное, как написание нового семафора.
2. Вы хотите легкий или быстрый примитив
Используйте семафоры, когда именно то, что вы хотите, им точно предоставлено.
Если вы не понимаете, что обеспечивается вашей реализацией двоичного семафора, тогда ИМХО, используйте мьютекс.
И, наконец, прочитайте книгу, а не полагайтесь только на SO.