¿Alguien puede sugerirme un proyecto para que me escriba?

13

Actualmente soy un desarrollador de C # con una comprensión bastante inestable de los subprocesos.

Ambos enlaces se han sugerido en otras publicaciones:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

¿Debo volver a lo básico y tal vez mirar algunos textos de informática sobre el tema?

Realmente siento que si salto y uso las bibliotecas de C #, realmente no tendré una base sólida de conocimiento sobre la cual construir. Creo que necesito aprender este tema desde cero como un estudiante de ciencias, luego usar las bibliotecas C #.

¿Alguien puede sugerir un enfoque para el aprendizaje de subprocesos, tal vez algunos enlaces o ideas de proyectos?

¡Gracias por adelantado!

Editar, gracias por todas las respuestas. Algunas personas han mencionado que un libro puede ser una buena idea, ¿alguien puede sugerir uno? Prefiero algo agnóstico del lenguaje. ¿Alguien sabe en qué clase se cubrirían estas cosas en un título en Informática? Estoy tratando de buscar en Google algunas notas y tareas gratuitas en línea.

bplus
fuente
No sé si esto ayuda, pero este es un tutorial simple que escribí en VB.Net hace un tiempo que explica el concepto básico de subprocesamiento. Debería poder convertirlo a C # con bastante facilidad. chrishaas.wordpress.com/2009/06/25/…
Chris Haas
Estoy fuertemente tentado a sugerir escribir una GUI multiproceso, con el argumento de que enseñaría los límites de lo que es posible hacer con hilos y permanecer cuerdo. Pero eso no sería constructivo, así que lo dejaré pasar como un comentario, no como una respuesta ... :-)
Donal Fellows

Respuestas:

3

Escriba un servidor web multiproceso. Aprenderás una TONELADA . Y no solo sobre enhebrar.

Gran maestro B
fuente
4

El problema del productor-consumidor es un ejemplo clásico, y le ayuda a comprender no solo los subprocesos, sino también la programación del procesador (se puede demostrar usando fork () para procesos secundarios en lugar de subprocesos) y cómo sus programas interactúan con el sistema operativo detrás las escenas.

Aquí hay un resumen de las cosas importantes que debe comprender con respecto al enhebrado / bifurcación 1. Cómo el sistema operativo programa las tareas (algoritmo round robin, por ejemplo) 2. Bloqueo de recursos (Si varios subprocesos están utilizando el mismo recurso, no desea que lo hagan) estar accediendo a ellos al mismo tiempo - MALAS COSAS SUCEDEN)

Aquí hay un artículo wiki sobre este problema clásico: http://en.wikipedia.org/wiki/Producer-consumer_problem

Básicamente, cree un "Productor" que genere hilos de "Consumidores". El productor produce un "recurso" y los consumidores lo consumen. Ponlo en un bucle y mira lo que sucede (te sorprenderá que eventualmente los consumidores consuman más recursos de los que están disponibles debido a métodos no sincronizados).


fuente
Interesante, parece que configuré este patrón sin darme cuenta al crear un servicio de Windows con subprocesos. Tu descripción fue perfecta. Es bueno saberlo, esto casi se marcaría como una respuesta a mi pregunta abierta.
Tony
2

Elija uno de los problemas clásicos altamente paralelos. Puede que le resulte más interesante elegir uno con aceleración superlineal.

Considere buscar en una lista sin clasificar y sin indexar. Este problema es trivialmente paralelo. Primero implemente una búsqueda de un solo hilo, luego una ingenua búsqueda paralela. Implementar el robo de trabajo. Genere algunos conjuntos de datos aleatorios y ejecute las tres versiones en los mismos conjuntos de datos. Calcule la aceleración.

Ben Voigt
fuente
0

No creo que un libro de texto sea el siguiente mejor paso. Un proyecto es el camino a seguir. Debería ser algo que te entusiasme.

La primera vez que hice subprocesos estaba mejorando el rendimiento de un rastreador web. Puede rastrear mucho más rápido si no está haciendo todas sus IO de red en serie. Para empezar, este es un gran proyecto porque puedes abordarlo de varias maneras, pero no es tan complicado como, por ejemplo, la programación GUI multiproceso. Tampoco requiere mucha habilidad especializada (por ejemplo, material informático pesado).

Por lo tanto, descubra información para raspar y comenzar a hackear. No debería llevarte mucho tiempo poner en marcha algo, será una introducción amable.

Enrique
fuente
Estoy de acuerdo con un proyecto, pero la E / S de red no es un buen caso de uso para subprocesos. La E / S sin bloqueo es más eficiente, utiliza menos recursos y sufre menos condiciones de carrera y casos de esquina que el mismo problema resuelto con subprocesos. Parte de aprender a ser un buen programador paralelo es reconocer cuándo los hilos no son ideales.
Ben Voigt
Es muy posible que tenga razón, la experiencia a la que me refería era un raspado web muy básico de Python donde agregué alrededor de 8 líneas de código para que sea multiproceso. Dudo que hubiera sido tan fácil hacerlo asincrónico con el código existente, pero me encantaría saber si estoy equivocado o cómo. Creo que parte de aprender a ser un buen programador paralelo podría ser tener mucha experiencia, buena y mala :)
Henry
0

Modele una aplicación simple Spy vs. Spy.

Cada espía se ejecuta en un hilo separado.

Cada espía puede infligir daño al otro espía, pero no directamente.

Cada espía puede robar recursos valiosos del otro espía, pero no directamente.

Ambos espías tienen un grupo limitado de recursos a su disposición y deben compartirlos. Solo un espía puede usar cualquier recurso dado a la vez.

Mike Hofer
fuente
0

Fuera de mi cabeza: la cuarta edición del libro de Bruce Eckel "Pensar en Java" tiene un capítulo muy largo sobre el enhebrado (> 100 páginas, casi un pequeño libro en sí mismo). He leído ediciones anteriores del libro, por lo que no leí este capítulo; pero recuerdo una de sus publicaciones en el blog (o las notas de lanzamiento de su libro), donde afirma que escribir esto fue muy difícil y al final fue un verdadero logro para él. Echale un vistazo...

Además de esto, hay un video curso de 2.5 horas en este sitio de capacitación comercial, pero puede obtener una prueba gratuita (debe dejar los datos de la tarjeta de crédito; así que no olvide darse de baja)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading

knb
fuente
0

¿Debo volver a lo básico y tal vez mirar algunos textos de informática sobre el tema?

Esa es siempre una buena opción y le recomendaría que tome un buen libro de hilos para familiarizarse con los hilos. Aprendí multihilo en Java y el conocimiento se tradujo fácilmente en C #.

Si desea un ejemplo práctico, le recomendaría que pruebe el problema del filósofo gastronómico .

Necesitas aprender varias cosas cuando te estás metiendo en multihilo:

  1. Las diferentes formas de sincronizar (semáforo, mutex, etc.)
  2. Operaciones atómicas (en C # se realiza mediante Interbloqueado para operaciones que no son atómicas de forma predeterminada).
  3. Programación concurrente sin bloqueo.
  4. Programación concurrente sin esperas.
  5. Subprocesos, grupos de subprocesos, trabajadores de fondo, etc.

No puedo pensar en otras cosas en este momento. ¡El tutorial de Albahari se ve muy bien!

Kiril
fuente
Desafortunadamente, comer filósofos no es un problema útil. Está destinado a ser una demostración de las condiciones de carrera, pero si el punto muerto realmente está sujeto a los caprichos del programador del sistema, otras tareas, interrupciones de hardware ... en resumen, es completamente indeterminado, y creo que este no es un buen lugar para comienza a aprender.
Ben Voigt
1
@Ben Voigt, estaría de acuerdo en que el problema de los filósofos no es determinista, pero diría que la mayoría de los problemas de enhebrado tampoco lo son. Cuando tomé una clase de programación concurrente, fue uno de los primeros ejercicios que hicimos, ahora no estoy afirmando que el maestro tenía necesariamente la razón, pero sin duda fue uno de los mejores maestros que he tenido y su capacidad para explicar y enseñar. La concurrencia fue excelente. El DPP demuestra solo un tipo de problema de concurrencia: bloqueo. El OP también debe analizar las condiciones de carrera, el problema ABA, etc.
Kiril
@Lirik: Claro, entiendo el problema de los filósofos gastronómicos. Pero no lo implementaría. Escribir código incorrecto puede convertirse en un hábito difícil de romper.
Ben Voigt
@Ben Voigt, lo siento, debo estar perdiendo algo: el punto del problema de los filósofos es escribir un programa que no se interrumpa, entonces, ¿cómo resolver el DPP requeriría escribir un "código incorrecto"?
Kiril