В чем разница между блокирующим и неблокирующим чтением? - PullRequest
3 голосов
/ 10 марта 2011

Добавьте к вышеупомянутому вопросу концепцию индикатора ожидания / отсутствия ожидания в качестве параметра функции ReadMessage в среде TCP / IP или UDP.

Описание функции третьей стороны гласит:

Эта функция используется для чтения сообщения из очереди, которая была определена предыдущим вызовом registerforinput. Индикатор ввода / ожидания не будет определять, будет ли эта функция блокироваться в указанной очереди, ожидая, когда данные будут помещены в очередь. Если указана опция nowait, а данные недоступны, то указателю будет возвращен указатель NULL. Когда данные станут доступны, эта функция вернет указатель на данные, прочитанные из очереди.

Что означает блокирование или неблокирование функции?

Ответы [ 4 ]

8 голосов
/ 10 марта 2011

Блокировка означает, что выполнение вашего кода (в этом потоке) будет остановлено на время вызова. По сути, вызов функции не вернется, пока не завершится операция блокировки.

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

4 голосов
/ 10 марта 2011

Аналогия, если вы позволите мне - извините, уже конец дня, и я в настроении, если он проголосует - ну, хорошо ...

Вы хотите попасть в шикарный ночной клуб, но вышибала говорит, что вы не можете войти, пока кто-нибудь не выйдет. Вы эффективно "заблокированы" на этом условии. Когда кто-то выходит, вы можете войти - или возникает какое-то условие ошибки, например, "это те тренеры?" Ваша ночь не начнется, пока вы не войдете, ваше удовольствие «заблокировано».

В «неблокирующем» сценарии вы сообщите баунсеру свой номер телефона, и он перезвонит вам, когда будет свободный слот. Так что теперь вы можете делать что-то еще, ожидая, когда кто-то выйдет, вы можете начать свою ночь где-нибудь еще и вернуться, когда вам позвонят, и продолжить там ...

Извините, если это не помогло ...

3 голосов
/ 10 марта 2011

Взгляните на это: http://www.scottklement.com/rpg/socktut/nonblocking.html

Вот некоторые выдержки из него:

  • 'По умолчанию сокеты TCP находятся в режиме «блокировки».Например, когда вы вызываете recv () для чтения из потока, управление не возвращается вашей программе, пока с удаленного сайта не будет прочитан хотя бы один байт данных.Этот процесс ожидания появления данных называется «блокировкой». '

  • ' Возможно установить дескриптор, чтобы он был переведен в режим «неблокирования».При переводе в неблокирующий режим вы никогда не ждете завершения операции.Это бесценный инструмент, если вам нужно переключаться между различными подключенными сокетами, и вы хотите, чтобы ни один из них не вызывал "блокировку" программы. '

Кроме того, обычно этоХорошая идея - сначала попытаться найти ответ (просто введите «блокирующее или неблокирующее чтение» в поисковой системе), а затем, как только вы наткнетесь на стену, придите и задайте вопросы, на которые вы не смогли найти ответ.к.Ссылка, которой я поделился выше, была вторым результатом поиска.Посмотрите на это замечательное эссе о том, что делать, прежде чем задавать вопросы на интернет-форумах: http://www.catb.org/~esr/faqs/smart-questions.html#before

0 голосов
/ 10 марта 2011

В вашем случае это означает, что функция не вернется, пока на самом деле не появится сообщение для возврата. Это предотвратит продвижение вашей программы вперед, но когда она продвинется вперед, у вас будет сообщение для работы.

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

...