Устанавливает ли блокировка mutex ожидающий поток для сна в POSIX API? - PullRequest
1 голос
/ 02 февраля 2020

Мы можем использовать блокировку мьютекса в POSIX API следующим образом:

/* acquire the mutex lock */
pthread_mutex_lock(&mutex);
/* critical section */
/* release the mutex lock */
pthread_mutex_unlock(&mutex);

POSIX API переводит ожидающий поток в спящий режим? Где очередь ожидания? Очередь ожидания не видна пользователю?

1 Ответ

2 голосов
/ 02 февраля 2020

POSIX API переводит ожидающий поток в спящий режим?

POSIX API - это просто API , его можно реализовать различными способами.

В Linux библиотека потоков POSIX использует futexes для реализации мьютексов. Когда мьютекс утверждается, реализация pthread будет использовать системный вызов futex(2) для запроса вмешательства от ядра, которое переводит в спящий режим или активизирует потоки по мере необходимости. Итак, да , потоки определенно могут быть усыплены при вызове pthread_mutex_lock().

Одна вещь, на которую следует обратить внимание, как предполагает статья в Википедии, заключается в следующем: правильно запрограммированная блокировка на основе futex делает не используйте системные вызовы, кроме случаев, когда блокировка установлена. И это точно относится к библиотеке потоков POSIX, поэтому у вас могут быть прекрасно функционирующие и синхронизированные программы, использующие потоки, которые никогда не выдают futex(2) системных вызовов.

Где находится очередь ожидания? Очередь ожидания не видна пользователю?

Поскольку мьютексы являются базами на фьютексах, а конфликты фьютексов в конечном итоге обрабатываются ядром, очередь ожидания находится в пространстве ядра , и не видно из пространства пользователя . Вы можете увидеть реализацию прямо в файле kernel/futex.c из исходного кода ядра Linux.

...