POSIX API переводит ожидающий поток в спящий режим?
POSIX API - это просто API , его можно реализовать различными способами.
В Linux библиотека потоков POSIX использует futexes для реализации мьютексов. Когда мьютекс утверждается, реализация pthread будет использовать системный вызов futex(2)
для запроса вмешательства от ядра, которое переводит в спящий режим или активизирует потоки по мере необходимости. Итак, да , потоки определенно могут быть усыплены при вызове pthread_mutex_lock()
.
Одна вещь, на которую следует обратить внимание, как предполагает статья в Википедии, заключается в следующем: правильно запрограммированная блокировка на основе futex делает не используйте системные вызовы, кроме случаев, когда блокировка установлена. И это точно относится к библиотеке потоков POSIX, поэтому у вас могут быть прекрасно функционирующие и синхронизированные программы, использующие потоки, которые никогда не выдают futex(2)
системных вызовов.
Где находится очередь ожидания? Очередь ожидания не видна пользователю?
Поскольку мьютексы являются базами на фьютексах, а конфликты фьютексов в конечном итоге обрабатываются ядром, очередь ожидания находится в пространстве ядра , и не видно из пространства пользователя . Вы можете увидеть реализацию прямо в файле kernel/futex.c
из исходного кода ядра Linux.