В Linux, если два потока созданы и оба они запущены, когда один из них вызывает recv()
или любой системный вызов IO, который блокирует, когда нет данных, что произойдет со всем процессом?Что происходит с другим потоком, когда один поток блокируется?
Будет ли другой блок нити также? Я полагаю, это зависит от того, как реализована потоковая обработка. Если библиотека потоков находится в пользовательском пространстве, а ядро полностью не знает о потоках внутри процесса, тогда процесс является объектом планирования и, следовательно, оба потока блокируются.
Кроме того, если другой поток не блокирует из-за этого, может затем его send()
данные через тот же сокет, который блокирует recv
нить? Дуплексный?
Любые идеи?
Спасибо! довольно полный ответ. хороший звонок. – Figo
Еще один вопрос: если данные попали в сокет до того, как поток вызывает recv(), будет ли поток фактически получать эти данные? – Figo
Да. Это действительно единственный способ, которым это могло бы работать, в неблокирующих сокетах датаграмм. Несколько маленьких заметок, которые я намереваюсь быть полезными - один, вы можете поэкспериментировать с такими вещами довольно легко. Напишите небольшую программу, которая «примет» соединение, затем «поспает» некоторое время, а затем вызовет «recv» в новом соединении.Используйте 'nc' (netcat) или что-то, чтобы создать соединение с вашим сервером, и сразу же напишите некоторые данные. Вы увидите, что сервер получил те же данные, что и вы отправили. Второе примечание - это действительно третий отдельный вопрос о том, что обычно представляет собой вопрос на форуме ... –