Я задал этот странный вопрос, который преследовал меня. Почему POSIX стандартизирует поддержку семафора как syscall, но оставляет условную переменную и мьютекс библиотеке pthread?
Что такое разделение ответственности здесь? Почему семафор не стандартизирован в пакете Pthread? Почему системный вызов для синхронизации, который стандартизирует POSIX, является семафором, а не мьютексом, условной переменной?
Не знаю. Предположим, производительность заключается в том, чтобы не реализовывать мьютекс как системный вызов. (Аппаратные инструкции Atomi c непривилегированы, поэтому их реализация на уровне пользователя возможна. Несмотря на то, что Linux предоставляет futex, он на самом деле пытается оптимизировать спин-блокировку в двухфазную блокировку, в направлении блокировки сна). И причина семафора в том, что семафор может управляться другим процессом, по сравнению с тем фактом, что мьютекс может быть разблокирован только процессом, который его удерживает? Операция V семафора позволяет процессу ожидать его разблокирования. Таким образом, семафор хранится в ядре, а идентификатор семафора подобен файловому дескриптору, возможности, предоставляемой ядром, что делает его системным вызовом, а не чисто пользовательским пакетом.
А как насчет условной переменной? Есть ли причина указывать это в Pthread, но не на уровне системного вызова? Поскольку он не имеет состояния и происходит от монитора, который является чисто программной конструкцией без учета состояния, поэтому он может быть реализован с использованием мьютекса?
Спасибо!