В чем разница между GCD Dispatch Sources и select ()? - PullRequest
13 голосов
/ 21 октября 2010

Я писал некоторый код, который заменяет некоторый существующий:

while(runEventLoop){
  if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
    // check file descriptors for activity and dispatch events based on same 
  }
} 

код чтения сокетов.Я хотел бы изменить это, чтобы использовать очередь GCD, чтобы я мог извлекать события в очередь, используя dispatch_async вместо поддержки массива «должен быть вызван при следующей итерации».Я также уже использую очередь GCD для / содержать / это конкретное действие, поэтому хочу перевести его в более естественную форму отправки GCD.(не цикл while (), монополизирующий последовательную очередь)

Однако, когда я попытался преобразовать это в форму, основанную на источниках диспетчеризации, запускаемых из обработчиков событий, связанных с DISPATCH_SOURCE_TYPE_READ и DISPATCH_SOURCE_TYPE_WRITE в дескрипторах сокетов, в библиотекекод, который зависел от этого планирования перестал работать.Мое первое предположение состоит в том, что я неправильно понимаю использование DISPATCH_SOURCE_TYPE_READ и DISPATCH_SOURCE_TYPE_WRITE - я предполагал, что они приведут примерно к тому же поведению, что и вызов select () с этими дескрипторами сокетов.

Не понимаю ли я источники отправки GCD?Или, что касается рефакторинга, я использую его в ситуации, когда он не подходит лучше всего?

1 Ответ

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

Краткий ответ на ваш вопрос: нет.Различий нет, и источники отправки GCD, и select() делают одно и то же: они уведомляют пользователя о том, что произошло конкретное событие ядра или что выполняется определенное условие.

Обратите внимание, что на устройстве Mac или iOS не следует использовать select(), а более продвинутые kqueue() и kevent() (или kevent64()).

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

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

...