Что происходит с другим потоком, когда один поток заблокирован?

В Linux, если два потока создаются и они оба работают, когда один из них звонит recv() или какой-либо IO syscall, что блоки, когда никакие данные не доступны, что произошло бы с целым процессом?

Действительно ли другой поток заблокируется также? Я предполагаю, что это зависит от того, как поточная обработка реализована. Если библиотека потока находится в пространстве пользователя и ядре, полностью не знающем о потоках в рамках процесса, то обработайте, объект планирования, и таким образом оба потока были заблокированы.

Далее, если другой поток не блокируется из-за этого, может он затем send() данные через тот же сокет, который блокируется recv поток? Дуплекс?

Какие-либо идеи?

5
задан Figo 27 January 2010 в 22:10
поделиться

3 ответа

Вы абсолютно правильно, чтобы поведение блокировки будет зависеть от того, что поток реализован в пространстве ядра или в пространстве пользователя. Если резьба реализована чисто в пользовательском пространстве (то есть ядро ​​полностью не воображается с резьбой), то любая всякая точка входа в блокировку в ядро ​​будет нанесена на некотором разблокировке, который может имитировать блокирую семантику до его вызова » Тема «(например, использование данных AiO для отправки / RECV вместо блокировки, и обратный вызов завершения делает поток Runnable, снова).

В Linux (и все остальные основные ОС я могу думать о), резьба реализована на уровне ядра или аналогично, а блокирующий вызов в ядро ​​ не привести к блоке всех других потоков Отказ

Да, вы можете Отправить () на розетку, для которой другой поток заблокирован на RECV () .

2
ответ дан 14 December 2019 в 13:36
поделиться

Это полностью возможно реализовать потоки в пользовательском пространстве, так что один поток может продолжаться, в то время как другой блок поток на ввод / вывод.

Неблокированная нить должна иметь возможность отправлять на розетку, в то время как другой поток блокируется на нем (я написал такой код).

2
ответ дан 14 December 2019 в 13:36
поделиться

Блокирующие вызовы в одном потоке не должны влиять на другие потоки.

Если заблокированная нить блокирует мьютекс перед входом в заблокированный вызов, и второй поток пытается заблокировать ту же Mutex, то они должны будут дождаться дождаться блокировки вызова для завершения и для первого потока для отпускания замок.

2
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: