• Miércoles 20 de Noviembre de 2024, 14:44

Autor Tema:  Programación Asíncrona  (Leído 4413 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 12:55 »
0
Hola, que tal.

Desarrollando una aplicacion, estoy usando una API de sonido que permite crear un stream(llenar el buffer) de manera asincrona sin bloquear la apliación, y una vez ha terminado, llama a un callback para procesar el sonido. Mi duda viene de que no entiendo muy bien como lo hace internamente. Para ser sinceros comprendo lo que significa hacerlo asíncrono, pero no así la manera de llevarlo a cabo.

Lo que he pensado es que quizas lo que hace es que, si se le especifica que no sea bloqueante, crea un nuevo thread para procesar esa petición y cuando termina llama a la funcion callback, de mientras el mainthread sigue su curso.

Se que no es muy bien una duda específica de C, es solo que me gustaría entender la filosofia de las llamadas asíncronas y como son tratadas. Más que nada para saber un poquito más.

No se si podriais explicarme un poco como funcionan las llamadas asíncronas.

He leido un par de links sobre esto, pero no acaba de quedarme claro del todo.

Gracias de antemano

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programación Asíncrona
« Respuesta #1 en: Viernes 1 de Abril de 2011, 13:24 »
0
Asíncrono significa que no sabes cuándo va a suceder. Esto normalmente se genera por interrupciones hardware. Es muy probable que esté implementado con hilos, aunque al no tener el código fuente pues tampoco lo sé, pero sería lo más lógico y sencillo.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #2 en: Viernes 1 de Abril de 2011, 14:03 »
0
Si, como yo tampoco lo tengo estoy un poco jodido xD, pero bueno, era más que nada para saber. Había leido que una forma sencilla era implementarlo con hilos, pero no me imagino una manera de hacer algo asíncrono sin hilos, quiero decir, si una aplicacion es ejecutada secuencialmente, no lo veo muy viable.

Gracias  ^_^

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #3 en: Viernes 1 de Abril de 2011, 14:07 »
0
Puedes trabajar de forma asíncrona sin hilos cuando estás haciendo E/S a disco mediante las estructuras OVERLAPPED de CreateFile/ReadFile/WriteFile.

Básicamente tu suscribes un callback (un puntero a función) en esas estructuras cuando llames a la función, que hará su operación en background y cuando haya terminado de hacer lo que le has dicho, ejecutará ese callback, informándote de que ha terminado, tras lo cual ya puedes hacer lo que quieras con lo cargado.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #4 en: Viernes 1 de Abril de 2011, 14:27 »
0
Hola rfog.

Si, entiendo como funciona una callback, lo que me mantiene un poco más en vilo es como la función logra desvincularse para hacer su tarea en segundo plano. Son un poco manias mias, ya seguiré investigando.

Gracias por la información =)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programación Asíncrona
« Respuesta #5 en: Viernes 1 de Abril de 2011, 14:34 »
0
Cita de: "rfog"
Puedes trabajar de forma asíncrona sin hilos cuando estás haciendo E/S a disco mediante las estructuras OVERLAPPED de CreateFile/ReadFile/WriteFile.
Aún así estás usando multihilo o multiproceso, aunque sea de forma transparente

Igualmente estoy casi convencido que lo hará con hilos u otro proceso si no necesita acceder a la memoria/código de tu proceso.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #6 en: Viernes 1 de Abril de 2011, 14:42 »
0
Cita de: "m0skit0"
Aún así estás usando multihilo o multiproceso, aunque sea de forma transparente

Igualmente estoy casi convencido que lo hará con hilos u otro proceso si no necesita acceder a la memoria/código de tu proceso.

Segun tengo entendido, los hilos a diferencia de los procesos, comparten memoria y código, no? Así que no habría mucho problema si un hilo auxiliar necesita modificar, por ejemplo, una variable global.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #7 en: Viernes 1 de Abril de 2011, 15:07 »
0
Cita de: "m0skit0"
Cita de: "rfog"
Puedes trabajar de forma asíncrona sin hilos cuando estás haciendo E/S a disco mediante las estructuras OVERLAPPED de CreateFile/ReadFile/WriteFile.
Aún así estás usando multihilo o multiproceso, aunque sea de forma transparente

Igualmente estoy casi convencido que lo hará con hilos u otro proceso si no necesita acceder a la memoria/código de tu proceso.

Pero eso lo está haciendo Windows internamente, tu no te tienes que preocupar de nada más de que cuando se ejecute tu callback los datos están en el buffer y son válidos.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #8 en: Viernes 1 de Abril de 2011, 15:11 »
0
Cita de: "Leber"
Cita de: "m0skit0"
Aún así estás usando multihilo o multiproceso, aunque sea de forma transparente

Igualmente estoy casi convencido que lo hará con hilos u otro proceso si no necesita acceder a la memoria/código de tu proceso.

Segun tengo entendido, los hilos a diferencia de los procesos, comparten memoria y código, no? Así que no habría mucho problema si un hilo auxiliar necesita modificar, por ejemplo, una variable global.

Así es. No sólo variables globales, sino variables de instanca y objetos. Un hilo tiene su propia pila pero comparte el montículo global de la aplicación, aunque si quieres puede tener un montículo aparte, así como TLS (Thread Local Storage), al menos en Windows.

Y sí, puedes acceder a cualquier objeto global o de instancia con visibilidad (un hilo no es más que una función que se ejecuta de forma "simultanea" con otras), pero ten en cuenta que tienes que "sincronizar" el acceso, porque un hilo podría leer una variable mientras que otro la está modificando y el resultado queda indeterminado.

La forma más sencilla de sincronizar es tener unos "flags" que indiquen cuándo un hilo está modificando. Aunque la forma correcta son las secciones críticas, los mutex y los semáforos.

Y declara todas las variables que vayan a usar diferentes hilos como "volatile" o podrías tener problemas en entornos multicore o multiprocesador.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #9 en: Viernes 1 de Abril de 2011, 16:24 »
0
Yo había he usado hilos, en códigos mios para aprender, y si que se que para modificar secciones críticas lo mejor es bloquear el mutex y luego desbloquearlo, lo que no sabía es que las variables debían ser volatiles.

Saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programación Asíncrona
« Respuesta #10 en: Viernes 1 de Abril de 2011, 16:35 »
0
Sí, volatile es para indicarle al compilador que esta variable puede cambiar de valor de forma asíncrona, por tanto no puede fiarse de la caché de instrucciones por ejemplo.

EDITO: caché de datos quiero decir
« última modificación: Viernes 1 de Abril de 2011, 17:29 por m0skit0 »

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #11 en: Viernes 1 de Abril de 2011, 17:02 »
0
Hostia, pues que raro, en ninguno de los manuales que lei acerca de hilos en POSIX hablaban acerca de esto.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programación Asíncrona
« Respuesta #12 en: Viernes 1 de Abril de 2011, 17:28 »
0
volatile no tiene nada que ver con POSIX, es algo del compilador.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #13 en: Viernes 1 de Abril de 2011, 17:35 »
0
Bueno, me refería a que cuando leia los tutoriales que mostraban como usar hilos con pthreads, no vi que las variables que usaban los distintos hilos fuesen volatile.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Programación Asíncrona
« Respuesta #14 en: Viernes 1 de Abril de 2011, 17:39 »
0
Cita de: "Leber"
Yo había he usado hilos, en códigos mios para aprender, y si que se que para modificar secciones críticas lo mejor es bloquear el mutex y luego desbloquearlo, lo que no sabía es que las variables debían ser volatiles.

Saludos

Eso es porque nunca lo has probado en entornos multicore o multiprocesador... Hasta en un micro HyperThreading no hay problema porque comparten caché y memoria, pero con un sistema multiprocesador sí, y más todavía si utiliza arquitectura numa completa. En ese caso, dependiendo del compilador, ni siquiera con volatile es suficente.

Con todo, al menos Visual C++ es lo suficientemente inteligente como para detectar el uso de una variable compartida y optimizarla sin perder la sincronización.

Respecto a los mutex, al menos en Windows son objetos del núcleo y son caros en tiempo de proceso y de ejecución, por lo que para sincronización entre hilos de un mismo proceso se recomiendan las secciones críticas porque son objetos locales mantenidos por el compilador y el runtime, mucho más rápidos y eficientes.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog