В Linux, если два потока создаются и они оба работают, когда один из них звонит recv()
или какой-либо IO syscall, что блоки, когда никакие данные не доступны, что произошло бы с целым процессом?
Действительно ли другой поток заблокируется также? Я предполагаю, что это зависит от того, как поточная обработка реализована. Если библиотека потока находится в пространстве пользователя и ядре, полностью не знающем о потоках в рамках процесса, то обработайте, объект планирования, и таким образом оба потока были заблокированы.
Далее, если другой поток не блокируется из-за этого, может он затем send()
данные через тот же сокет, который блокируется recv
поток? Дуплекс?
Какие-либо идеи?
Вы абсолютно правильно, чтобы поведение блокировки будет зависеть от того, что поток реализован в пространстве ядра или в пространстве пользователя. Если резьба реализована чисто в пользовательском пространстве (то есть ядро полностью не воображается с резьбой), то любая всякая точка входа в блокировку в ядро будет нанесена на некотором разблокировке, который может имитировать блокирую семантику до его вызова » Тема «(например, использование данных AiO для отправки / RECV вместо блокировки, и обратный вызов завершения делает поток Runnable, снова).
В Linux (и все остальные основные ОС я могу думать о), резьба реализована на уровне ядра или аналогично, а блокирующий вызов в ядро не привести к блоке всех других потоков Отказ
Да, вы можете Отправить ()
на розетку, для которой другой поток заблокирован на RECV ()
.
Это полностью возможно реализовать потоки в пользовательском пространстве, так что один поток может продолжаться, в то время как другой блок поток на ввод / вывод.
Неблокированная нить должна иметь возможность отправлять на розетку, в то время как другой поток блокируется на нем (я написал такой код).
Блокирующие вызовы в одном потоке не должны влиять на другие потоки.
Если заблокированная нить блокирует мьютекс перед входом в заблокированный вызов, и второй поток пытается заблокировать ту же Mutex, то они должны будут дождаться дождаться блокировки вызова для завершения и для первого потока для отпускания замок.