2017-02-05 1 views
-1

Недавно из-за проекта C++, с которым я столкнулся, я столкнулся с концепцией неблокирующих операций ввода-вывода на C++. Если кому-то требуется кросс-платформенное решение, можно ли реализовать неблокирующий режим без использования boost.asio, libuv и любой соответствующей внешней библиотеки? Примером может быть очень полезно различать разницу между блокировкой и неблокирующим вводом-выводом.Блокирующие и неблокирующие операции ввода-вывода в C++ определении и реализации

+0

«I/O» - это не вещь; вы, вероятно, имеете в виду I/O. – melpomene

+0

Что именно вы подразумеваете под «STL»? – melpomene

+0

Неблокирующий ввод-вывод и потоки являются ортогональными: вы можете иметь как с, так и без другого. – melpomene

ответ

0

I/O - в любом вычислительном смысле - требуется время. Где это время используется, определяется, является ли операция ввода-вывода «блокирующей» или «неблокирующей».

Неблокирующий ввод-вывод происходит из вызывающего потока. Обычно это означает «ожидание» для сигнала от ввода-вывода, сообщающего вам, что есть данные.

Блокирование операций ввода-вывода останавливает выполнение вызывающего потока до тех пор, пока операция не будет выполнена.

Для сетевых розеток:

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

Для файлов:
Аналогичный случай с сетевыми сокетами только вы читаете из аппаратного устройства так что его, вероятно, будет быстрее.

Что касается многопоточности, то это злой зверь, с которым можно работать. Как правило, это не должно быть в вашем словаре терминов C++, если вы в этом не нуждаетесь.

+0

Не могу вспомнить последний раз, когда мне приходилось кодировать «Занят ждать» .Это не обычный способ делать вещи. Кроме того, что именно вы подразумеваете под «*, вам нужно будет опросить сокет для получения информации о том, закончил ли он чтение, и если да, то размер данных, которые Вашингтон s read * "? – melpomene

+0

Если честно, у меня нет коммерческого или профессионального опыта. Я использовал сетевые сокеты из SFML (Simple/Fast Media Library), и если вы решили использовать неблокирующий сокет, вам нужно вызвать функцию, чтобы вернуть статус сокета. Что касается оживленного ожидания, то из моего опыта я использовал один для Open Steamworks для обработки событий. – Gambit

Смежные вопросы