Является ли добровольная передача ЦП единственным способом, с помощью которого потоки в библиотеке Linux pthread могут включить планирование другого потока в рамках того же процесса? (Потому что pthread - это реализация потока на уровне пользователя?)
Кажется, что pthread_yield () и мьютексы (предоставляемые библиотекой pthread) - единственный способ вызвать планировщик для запуска выполнения другого потока. Это правда ?
В Linux каждый поток уровня пользователя реализуется через соответствующий поток уровня ядра, поэтому pthreads.h обеспечивает полную вытесняющую многозадачность.
Re: «... Поскольку pthread - это реализация потока на уровне пользователя ...» библиотека pthreads была такой, может быть, лет двадцать назад. В наши дни это стандартный API, который практически всегда реализуется с помощью системных вызовов, которые создают настоящие потоки ОС.
Спасибо Джереми и запятнал ваши ответы (данные в комментариях).
Нет, любой вызов, который также блокирует текущий поток, будет планировать другой шаг. Сюда входят вызовы библиотек, такие как sleep (), read (), select (), pthread_mutex_lock () и многие другие.
Обратите внимание, что pthread не является чистой реализацией потока пользовательского уровня в Linux, он отображает 1 поток пользовательского режима в 1 задачу ядра.
Под read () вы имеете в виду системный вызов, который перехватывает ядро, верно? Однако вы упомянули, что поток сопоставлен с задачей ядра. Есть ли веб-страница, объясняющая эту реализацию?
Да, именно это и делает вызов read (). См. Документацию man7.org/linux/man-pages/man7/pthreads.7.html и проектную документацию akkadia.org/drepper/nptl-design.pdf
Вы описываете поведение
co-operative multitasking
. Такое поведение можно наблюдать в очень древних операционных системах без встроенной поддержки многопоточности, где библиотеки потоков реализованы только на уровне пользователя (такие реализации иногда называют «зелеными потоками»). Однако почти все современные ОС используютpreemptive multitasking
, что означает, что ядро поддерживает потоки и может перемещать потоки в ЦП и выходить из него в любое время, когда захочет. В современных ОС функция pthread_yield () является излишней, поскольку потоки будут «автоматически выдаваться» всякий раз, когда ОС сочтет это целесообразным.