Каков лучший epoll/kqueue/select equvalient в Windows?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

35
задан kennytm 28 October 2010 в 20:02
поделиться

2 ответа

В Windows асинхронные операции сделаны операцией файла, не дескриптором. Существует несколько способов ожидать на операциях файла для завершения асинхронно.

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

В Win32, асинхронные операции используют OVERLAPPED структура для содержания состояния о выдающейся операции IO.

  1. Партнер файлы с Порт Завершения IO и диспетчеризируют асинхронные запросы IO. Когда операция завершится, она поместит сообщение завершения на очередь, на которой Ваш рабочий поток (потоки) может ожидать и получить, когда они прибывают. Можно также поместить определяемые пользователем сообщения в очередь. Нет никакого предела тому, сколько файлов или сообщений с очередями может использоваться с портом завершения
  2. Отправка каждая операция IO с событием. Событие, связанное с операцией, станет сообщенным (удовлетворите ожидание), когда оно завершается. Используйте WaitForMultipleObjects для ожидания на всех событиях сразу. Это имеет недостаток только способности ожидать на MAXIMUM_WAIT_OBJECTS объекты сразу (64). Можно также ожидать на других типах событий одновременно (завершение процесса/потока, взаимные исключения, события, семафоры)
  3. Использование пул потоков . Пул потоков может взять неограниченное количество объектов и операций файла, чтобы ожидать на и выполниться определяемая пользователем функция после завершения каждый.
  4. Использование ReadFileEx и WriteFileEx для организации очередей Асинхронные Вызовы процедуры (APCs) к вызывающему потоку и SleepEx (или WaitFor{Single|Multiple}ObjectsEx) с Alertable TRUE для получения уведомления для каждой операции, когда это завершается. Этот метод подобен порту завершения IO, но только работает на один поток.

ядро Windows NT не делает различия между сокетом, дисковым файлом, каналом, и т.д. операции файла внутренне: все эти опции будут работать со всеми типами файлов.

39
ответ дан Delimitry 27 November 2019 в 07:20
поделиться

Еще нет того, насколько я знаю. Друг и я работаем над Windows с открытым исходным кодом epoll реализация (ссылка ниже), но мы сталкиваемся с проблемами, выясняющими, как заставить его действовать то же как реализация Linux.

Текущие препятствия:

  • В Linux, дескрипторы файлов и дескрипторы сокета являются взаимозаменяемыми, но в Windows они не. Оба должны быть совместимы с epoll реализацией.
  • В Windows это довольно хитро для получения событий ядра..., который является, как epoll работает в Linux. Мы предполагаем, что программа, пользующаяся нашей межплатформенной epoll библиотекой, будет работать заметно медленнее в Windows, чем Linux.

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

http://sourceforge.net/projects/cpoll

1
ответ дан Heron 27 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

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