2010-01-23 17 views
12

He estado considerando agregar procedimientos enhebrados a mi aplicación para acelerar la ejecución, pero el problema es que honestamente no tengo ni idea de cómo usar los subprocesos, o lo que se considera "seguro para subprocesos". Por ejemplo, ¿cómo utiliza un motor de juego los hilos en sus procesos de renderizado, o en qué contextos los hilos solo serían considerados como un obstáculo? ¿Alguien puede señalar algunos recursos para ayudarme a aprender más o explicar aquí?¿Puede alguien explicarme los hilos?

+2

Eso es extremadamente general. Un hilo es solo un trabajador que ejecuta comandos. La "seguridad del subproceso" es asegurarse de que dos o más subprocesos no causen problemas cuando interactúan. En cuanto a un motor de juego que utiliza hilos ... hay alrededor de un millón de formas de hacerlo. –

+3

Para ser franco. Olvídate de agregar hilos. Esto es como decir que tiene una comprensión básica de primeros auxilios y que quiere hacer una cirugía cerebral. Regresa y aprende los conceptos básicos. –

+0

Esta pregunta es demasiado amplia para ser respondida de manera razonable. – Kev

Respuesta

31

Este es un tema muy amplio. Pero aquí están las cosas que me gustaría saber si no sabía nada de las discusiones:

  • Son unidades de ejecución dentro de un único proceso que suceden "en paralelo" - lo que esto significa es que la unidad de ejecución actual en el procesador cambia rápidamente. Esto se puede lograr a través de diferentes medios. El cambio se denomina "cambio de contexto", y hay una sobrecarga asociada a esto.

  • ¡Pueden compartir la memoria! Aquí es donde pueden ocurrir problemas. Hablo de esto más a fondo en un punto posterior.

  • El beneficio de paralelizar su aplicación es que la lógica que utiliza diferentes partes de la máquina puede suceder simultáneamente. Es decir, si parte de su proceso está vinculado a E/S y parte de él está vinculado a la CPU, la operación intensiva de E/S no tiene que esperar hasta que la operación con uso intensivo de CPU haya finalizado. Algunos lenguajes también le permiten ejecutar subprocesos al mismo tiempo si tiene un procesador multinúcleo (y también paraleliza operaciones intensivas en CPU), aunque este no siempre es el caso.

  • Hilo de seguridad significa que no hay condiciones de carrera, que es el término que se utiliza para los problemas que se producen cuando termina la ejecución del proceso depende del momento (algo que no quiere depender de). Por ejemplo, si usted tiene roscas A y B tanto incrementar un contador compartido C, se podía ver el caso en el que A lee el valor de C, entonces B lee el valor de C, entonces A sobrescribe C con C+1, entonces B sobrescribe C con C+1. ¡Observe que C solo en realidad se incrementa una vez!

  • Un par de formas comunes de evitar las condiciones de carrera incluyen la sincronización , que excluye el acceso mutuo al estado compartido, o simplemente no tiene ningún estado compartido en absoluto. Pero esto es solo la punta del iceberg: la seguridad de las hebras es un tema bastante amplio.

Espero que ayude! Comprenda que esta fue una introducción muy rápida a algo que requiere un buen aprendizaje. Yo recomendaría encontrar un recurso sobre multihilo en su idioma preferido, sea lo que sea que sea, y darle una lectura completa.

+0

¡Eso me ayudó muchísimo! ¡Gracias! – Orm

+0

+1 buena introducción al tema. – Grundlefleck

+0

@Orm: muy bienvenido; Me alegro de que haya sido útil. – danben

0

Hay un buen libro, Java Concurrency en la práctica, http://www.javaconcurrencyinpractice.com/.

+0

Aunque este es un libro impresionante, supone un conocimiento previo de los mecanismos básicos de concurrencia en Java, para los cuales el asker probablemente no esté preparado. – Grundlefleck

+0

Correcto, lo olvidé, no incluye una introducción. –

1

Los subprocesos no aceleran las aplicaciones. Los algoritmos aceleran las aplicaciones. Los hilos pueden usarse en algoritmos, si corresponde.

+2

Los hilos * pueden * acelerar su aplicación, bajo ciertas condiciones. Por ejemplo, cuando las tareas de bloqueo en serie se pueden dividir en tareas paralelas. El efecto se incrementa en los sistemas multi-core, que se está convirtiendo en la norma. Considere una tarea que debe realizar una solicitud de TCP/IP y esperar una respuesta. Si esta tarea se bloquea en un hilo, 10 de ellos tomará 10 veces el tiempo. Si se compara, esto se puede reducir a poco más de 1 vez la cantidad de tiempo. – Grundlefleck

+0

... ¿o es solo una corrección de la terminología? :) – Grundlefleck

+0

Sí, he estudiado en una clase de algoritmos y siempre estoy estudiando algoritmos, pero quería ampliar mis horizontes un poco más con los procesadores multi-core convirtiéndose en la norma. – Orm

1

Bueno, alguien probablemente responderá mejor esto, pero los hilos tienen el propósito de tener un procesamiento de fondo que no congele la interfaz de usuario.No quiere dejar de aceptar la entrada del teclado o la entrada del mouse, y decirle al usuario, "solo un momento, quiero finalizar este cálculo, solo serán unos segundos más". (Y sin embargo es increíble cuántas veces los programas comerciales hacen esto.

En cuanto a seguridad de subprocesos, se refiere a una función que no tiene un estado guardado interno. Si lo hiciera, no podría tener múltiples subprocesos usándolo simultáneamente.

En cuanto a la programación de subprocesos, solo tiene que comenzar a hacerlo, y luego comenzará a encontrar varios problemas exclusivos de la programación de subprocesos, por ejemplo acceso simultáneo a datos, en cuyo caso debe decidir utilizar algún método de sincronización como secciones críticas o mutexes o algo más, cada uno con matices ligeramente diferentes en su comportamiento.

En cuanto a las diferencias entre los procesos Los procesos s y threads (que no se preguntaron) son una entidad de nivel de SO, mientras que los threads están asociados a un programa. En ciertos casos, su programa puede querer crear un proceso en lugar de un hilo.

+2

Aunque algo sin estado es seguro para subprocesos, seguro para subprocesos NO significa apátrida – danben

+0

Lo siento, estoy de un humor exigente ... "... los hilos tienen el propósito de tener un procesamiento de fondo que no congele la interfaz de usuario " - que dice que ese es el propósito exclusivo de enhebrar, que definitivamente no es cierto, aunque es uno de los usos. – Grundlefleck

1

Los subprocesos son simplemente una forma de ejecutar varias cosas simultáneamente (suponiendo que la plataforma en la que se están ejecutando es capaz de ejecutarse en paralelo). La seguridad del subproceso es simple (bueno, nada con subprocesos es realmente simple) asegurándose de que los hilos no se afectan unos a otros de manera perjudicial.

En general, es poco probable que los sistemas usen varios subprocesos para representar gráficos en la pantalla debido a las múltiples implicaciones de rendimiento y problemas de complejidad que pueden surgir. Sin embargo, otras tareas relacionadas con la gestión del estado (o AI) pueden moverse a hilos separados.

1

Primera regla de roscar: no roscar. Segunda regla de enhebrado: si tiene que violar la regla uno ... no. Tercera regla: OK, está bien que tengas que usar subprocesos, por lo que antes de continuar, asómate a las trampas, comprende el bloqueo y los problemas comunes de subprocesos como el interbloqueo y el enclavamiento.

Comprenda que el enhebrado no acelera nada, solo es útil para procesos de larga duración en segundo plano que permiten al usuario hacer otra cosa con la aplicación. Si tiene que permitir que el usuario interactúe con la aplicación mientras la aplicación hace algo más en segundo plano, como sondear un socket o esperar la entrada ansincrónica desde otra parte de la aplicación, entonces es posible que deba enhebrar.

Las secciones de hilo en Effective Java y Clean Code son buenas introducciones a los hilos y sus trampas.

+4

Primera regla de generalizaciones: no generalizar. – danben

+5

Multithreading * does * proporciona una aceleración cuando tiene una tarea paralelizable, unida a la CPU y hay múltiples procesadores (o núcleos) disponibles. Divida el trabajo en * n * hilos y realice el trabajo en aproximadamente 1/n vez, donde * n * es menor o igual que la cantidad de procesadores. – Wyzard

+1

Esto es cierto y más aplicable actualmente con más procesadores multi-core que nunca. Punto a favor. Pero utilizar los hilos simplemente para la optimización incluso en entornos multiprocesador es una proposición arriesgada, aconsejable solo si su arquitectura es * necesariamente * asíncrona, por ejemplo cuando se escribe un servidor de algún tipo que derivará a varios trabajadores, etc. –

2

Hay cuatro cosas que debe saber sobre los hilos.

  1. Los subprocesos son como procesos, pero comparten memoria.

  2. Los subprocesos a menudo tienen soporte de hardware, sistema operativo y de idioma, lo que los hace mejores que los procesos.

  3. Hay muchas pequeñas cosas quisquillosas que los subprocesos necesitan para admitir (como bloqueos y semáforos) para que no consigan la memoria que comparten en un estado incoherente. Esto los hace un poco difíciles de usar.

  4. El bloqueo no es automático (en los idiomas que conozco), por lo que debe tener mucho cuidado con la memoria que comparten (implícitamente).

1

Orm, gran pregunta que hacer. Creo que todos los programadores serios deberían aprender sobre los hilos, porque eventualmente usted va a al menos considere usarlos y realmente desea estar preparado cuando suceda. Los errores concurrentes pueden ser increíblemente sutiles y la mejor forma de evitarlos es conocer qué expresiones son seguras (-ish).

le recomiendo que tome el tiempo para leer la Programación Concurrente libro en Java: Principios y patrones Diseño por Doug Lea: http://gee.cs.oswego.edu/dl/cpj/

Lea toma el tiempo no sólo para enseñarle los conceptos, sino también para mostrarle las formas correctas e incorrectas de utilizar las primitivas de programación simultáneas (en Java pero también es útil para cualquier otro entorno que use concurrencia de estilo de bloqueo/señalización de memoria compartida). Más que nada, enseña respeto por la dificultad de la programación simultánea.

debo añadir que este estilo de programación concurrente es la más común, pero no el único enfoque. También hay mensajes que pasan, lo cual es más seguro pero te obliga a estructurar tu algoritmo de manera diferente.

1

Desde el post original es muy amplio, y también etiquetados con C++, creo que los siguientes indicadores son relevantes:

Anthony Williams, mantenedor de la Biblioteca Boost hilo, ha estado trabajando en un libro llamado "La concurrencia C++ en acción ", una descripción de la cual puede encontrar here. El primer capítulo (introductorio) está disponible de forma gratuita en formato pdf here.

Además, Herb Sutter (conocido, entre otras cosas, por su "excepcional C++" serie) ha escrito un libro que se llamará "concurrencia efectiva", muchos artículos de los cuales están disponibles en forma de borrador here.

Cuestiones relacionadas