Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Introducción a Multithreading?

Iniciado por Pogacha, 20 de Diciembre de 2007, 12:13:26 PM

« anterior - próximo »

Pogacha

Hola donde puedo hallar una introducción/documento/tutorial sobre multithreading?

Basicamente entiendo los problemas que el multithreading pueda ocacionar con escrituras parciales y ejecución parcial al leer y escribir señalizadores.

Pero no estoy seguro de como estos problemas se presentan en las librerias estandares de C y C++.

Mi problema en particular, quiero implementar mi propio audio mixer, en donde necesito un hilo independiente para evitar "tirones".

Basicamente el desarrollo sería así:

Tengo el hilo "Audio", el cual esta en standby hasta que necesita acualizar los buffers. Cuando esto pasa, antes de iterar sobre ninguna lista bloquea el cambio de tareas y cuando termina de usarla la desbloquea.
En el hilo principal, cada vez que se van a modificar los datos ejecución de audio de manera peligrosa se bloquean el intercambio de tareas. Modificar un volumen, pitch o panning y cosas así son atomicas y unidireccionales, no creo que sea necesario bloquear ahí, pero si al borrar e insertar de una lista (aca puede pasar cualquier cosa si hay escritura parcial).
La apertura y cerrado de archivos de audio lo hace por cuenta propia el hilo del audio (pero a travez de la libreria standart). Es aca donde tengo miedo de no saber que puede pasar, si hay datos estaticos involucrados puede que una escritura/lectura parcial haga colgar a la computadora. Se que el rand tiene datos estaticos por que no puede andar de otra forma, pero no estoy seguro de muchas de las demas funciones.

1ra pregunta.
¿Si solamente estaré haciendo esto, se puede linkear la aplicación como single-thread?

2da pregunta.
¿Que overhead hay en las librerias standarts de C en su versión multi-threading?

3ra pregunta.
¿Donde mas puede haber problemas?

4ta pregunta.
¿Que lectura que apunte ligeramente a mi problema conocen?

5ta pregunta.
Supongo que tengo que tratar de minimizar el tiempo de bloqueo de tareas. ¿Pero que conviene mas? ¿Un solo bloqueo general de X tiempo o muchos pequeños pero que en total tengan menor tiempo de bloqueo?


Cualquier información se agradecerá energicamente (con piruetas y todo)

Edit: Me equivoque de sección :oops:

Tei

Pues chico. La carrera de informatica no se parece nada nada a montar en bicicleta. No me acuerdo de practicamente nada.

Lo cual nunca me ha parado antes, y no me va a parar ahora.

Consejos generales que podria dar alguien que no tiene ni puta idea del tema y que por tanto son inutiles porque a cualquiera ya se le habran ocurrido:

- Minimiza la cantida de datos que "comparten" los hilos (en este caso el hilo multimedia con los demas).
- Si no te queda mas remedio. Create una clase "variable protegida" que tenga un metodos para hacer modificaciones de forma atomica.  Cuando la utilices, se ligeramente consciente de que llamar a sus metodos es costoso.
- Si te encaja. Puedes usar una arquitectura "productor-consumidor". En el cual el hilo multimedia consume ordenes apiladas por los otros hilos. Apilar y desapilar ordenes seran operaciones atomicas.

Consejos totalmente aleatorios que probablemente no vienen a cuento y pueden contener errores garrafales que una simple inspeccion de google revelaria y que quizas denoten que no me he leido bien tu mensaje y que no me acuerdo de estos temas:
- Revisa las funciones que proporciona tu libreria/sistema operativo. Seguro que hay una funcion frezze.
- Escribe tu programa sin atender a ninguna proteccion contra esta clase de problemas. Sin duda habra bugs, seran inpredecibles, pero no preveo que importantes. Un videojuego no es un programa de facturacion con 2 millones de operaciones por segundo. Quizas un pequeño glich en el sonido si se cambia de nivel no tenga importancia. ¿Que es lo peor que puede pasar? (famosas ultimas palabras).

Pogacha

Gracias, algunos concejos son bueno otros terriblemente malos  :lol:

Citar¿Que es lo peor que puede pasar? (famosas ultimas palabras).
Access Violation?

Pablo Zurita

Cita de: "Pogacha"1ra pregunta.
¿Si solamente estaré haciendo esto, se puede linkear la aplicación como single-thread?
Depende de cómo uses la run-time library y el compilador que uses. Mira la documentación de tu compilador.

Cita de: "Pogacha"2da pregunta.
¿Que overhead hay en las librerias standarts de C en su versión multi-threading?
Depende de lo que uses. En general a no ser que estés dispuesto a escribir la librería de nuevo, no es algo que realmente este en tus manos. De lo contrario, hace profiling antes de empezar a preocuparte por un problema que capaz que ni existe.

Cita de: "Pogacha"3ra pregunta.
¿Donde mas puede haber problemas?
Hay varios problemas más como false sharing (dos variables totalmente diferentes terminan en una misma línea de cache), falta de memory barriers (el CPU o compilador puede reordenar operaciones de lectura/escritura cuando el orden puede ser crítico, se resuelve justamente poniendo los memory barriers), etc.

Cita de: "Pogacha"4ta pregunta.
¿Que lectura que apunte ligeramente a mi problema conocen?
Podes mirar http://msdn2.microsoft.com/en-us/library/ms686353%28VS.85%29.aspx

Cita de: "Pogacha"5ta pregunta.
Supongo que tengo que tratar de minimizar el tiempo de bloqueo de tareas. ¿Pero que conviene mas? ¿Un solo bloqueo general de X tiempo o muchos pequeños pero que en total tengan menor tiempo de bloqueo?
Lo que buscas es minimizar el tiempo bloqueo, si es posible no bloquear la ejecución de un thread. También es importante minimizar la cantidad de datos compartidos por diferentes threads. Por ejemplo yo en ciertos casos puedo evitar o minimizar el bloqueo usando double o ring-buffering de información o usando la Interlocked API en Windows y soluciones similares en otras plataformas. Como siempre con todo lo que se refiere a performance, genera estadísticas, hace profiling. De lo contrario no vas a saber realmente cual es la mejor solución. También es importante tener en cuenta dónde vas a ejecutar tu código, no es lo mismo tener dos threads en cores separados o dos threads que se tienen que ejecutar en un solo core (en cuyo caso no son realmente concurrentes).

Pogacha

OK, gracias Pablo!
Estuve leyendo un rato largo y no lo llamaría una introducción :P yo lo que estaba buscando era "Multi-threading para tontos"
Habla sobre muchos temas que no son de mi especial consideración.

Básicamente lo que necesito saber es bastante sencillo pero especifico, seguiré investigando, pues las principales dudas no las logro resolver todavía.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.