2010-10-21 11 views
13

he estado escribiendo un código que reemplaza algunas existente: código de lectura¿Cuál es la diferencia entre GCD Despatch Sources y select()?

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

zócalo. Me gustaría cambiar esto para usar una cola GCD, de modo que pueda mostrar eventos en la cola usando dispatch_async en lugar de mantener una matriz "debe llamarse en la próxima iteración". También estoy usando una cola de GCD para/contener/esta acción en particular, por lo tanto, quiero delegarla a un formulario de envío de GCD más natural. (No un tiempo() bucle monopolizar una cola de serie)

Sin embargo, cuando intenté refactorizar esta en una forma que se basó en fuentes de despacho despedido de controladores de eventos vinculados a DISPATCH_SOURCE_TYPE_READ y DISPATCH_SOURCE_TYPE_WRITE en los descriptores de socket, el código de la biblioteca que Depende de esta programación dejó de funcionar. Mi primera suposición es que estoy malinterpretando el uso de DISPATCH_SOURCE_TYPE_READ y DISPATCH_SOURCE_TYPE_WRITE - Supuse que producirían aproximadamente el mismo comportamiento que llamar a select() con esos descriptores de socket.

¿Entiendo mal las fuentes de envío de GCD? O, respecto al refactor, ¿lo estoy usando en una situación en la que no es el más adecuado?

+0

Debería mostrar su código: lo que intentó. Mientras tanto, Mike Ash tiene un código de muestra para comprobar - http://www.mikeash.com/svn/GCDWeb/GCDWeb.m - servidor web GCD. – robertvojta

Respuesta

3

La respuesta breve a su pregunta es: ninguna. No hay diferencias, las dos fuentes de envío de GCD y select() hacen lo mismo: notifican al usuario que un evento específico del kernel ocurrió o que una condición en particular es verdadera.

Tenga en cuenta que, en un Mac o dispositivo iOS no se debe utilizar select(), sino más bien la más avanzada y kqueue()kevent() (o kevent64()).

Ciertamente puede convertir el código para usar fuentes de envío GCD, pero debe tener cuidado de no romper otro código basándose en esto. Por lo tanto, esto necesita una inspección completa de todo el código que maneja señales, descriptores de archivos, socket y todos los otros eventos de núcleo de bajo nivel.

Puede ser una solución más simple podría ser mantener el código original, simplemente agregando código GCD en la parte que reacciona a los eventos. Aquí, distribuye eventos en colas diferentes según el tipo de evento en particular.

+0

Acepto, una diferencia es que con GCD puedes modularizar tu código en máquinas de estado separadas con colas de distribución independientes asociadas a cada fuente. No estoy seguro, pero creo que internamente GCD podría estar usando algo similar para seleccionarse a sí mismo. – user210504

+2

¿Puede ser más específico acerca de por qué kqueue() es mejor que select() en iOS? A partir de mi breve exploración, parece que se prefiere kqueue() cuando tiene que supervisar muchos eventos, pero ¿hay alguna razón para creer que es mejor que select() en un fdset con fd individual? En ese caso, parece que la semántica es casi idéntica, por lo que no estoy seguro de por qué el rendimiento sería diferente. – user1055568

+1

Las actuaciones son en realidad diferentes: inténtelo usted mismo. Debería ver que, incluso para un descriptor de archivo único con actividad intensa, kqueue() funciona mejor. Probablemente, Apple no insistió demasiado en mejorar la implementación de la antigua selección(). La nueva llamada al sistema queue() es mucho más poderosa y tiene un mejor rendimiento. La única razón por la que veo usar select() es que tiene un código heredado que no desea actualizar. –

Cuestiones relacionadas