Что происходит с другим потоком, когда один поток блокируется? - PullRequest
5 голосов
/ 28 января 2010

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

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

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

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 28 января 2010

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

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

2 голосов
/ 28 января 2010

Вы абсолютно правы, что поведение блокировки будет зависеть от того, реализован ли поток в пространстве ядра или в пространстве пользователя. Если многопоточность реализована исключительно в пользовательском пространстве (то есть ядро ​​полностью не связано с многопоточностью), то любая блокирующая точка входа в ядро ​​должна быть обернута каким-то неблокирующим вариантом, который может симулировать семантику блокировки для его вызова " thread "(например, используя AIO для отправки / получения данных вместо блокировки, а обратный вызов завершения делает поток работоспособным, опять же).

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

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

2 голосов
/ 28 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...