¿Cómo practicarías concurrencia y multihilo? [cerrado]

33

He estado leyendo sobre concurrencia, subprocesos múltiples y cómo "se acabó el almuerzo gratis" . Pero aún no he tenido la posibilidad de usar MT en mi trabajo.

Por lo tanto, estoy buscando sugerencias sobre lo que podría hacer para practicar algo de MT pesado de CPU a través de ejercicios o participación en algunos proyectos de código abierto.

Gracias.

Editar: Estoy más interesado en proyectos de código abierto que usan MT para tareas vinculadas a la CPU, o simplemente algoritmos que son interesantes de implementar usando MT, en lugar de libros o documentos que solo describen las herramientas como hilos, mutexes y bloqueos, o cómo se puede usar MT para tener GUI receptivas ...

Xavier Nodet
fuente
1
Posiblemente de interés: programmers.stackexchange.com/questions/24936/…
Orbling
55
P: ¿Cómo practicaría concurrencia y subprocesamiento múltiple? R: haciendo malabarismos
Steven A. Lowe
@ Steven: No muy lejos, de verdad.
Robert Harvey
El enlace "almuerzo gratis ha terminado" está muerto
Usuario
Debería estar bien ahora ...
Xavier Nodet

Respuestas:

15

El artículo de Joseph Albahari sobre Threading en C # es uno de los mejores recursos que he visto.

La tabla de contenido está abajo. Tenga en cuenta que algunos de los temas, como la Biblioteca de tareas paralelas, son específicos de .NET, pero gran parte de ellos son aplicables a otros lenguajes, especialmente a Java.

GETTING STARTED
Introduction and Concepts
Join and Sleep
How Threading Works
Threads vs Processes
Threading’s Uses and Misuses
Creating and Starting Threads
Passing Data to a Thread
Naming Threads
Foreground vs Background
Thread Priority
Exception Handling
Thread Pooling
Thread Pooling via TPL
Thread Pooling Without TPL
Optimizing the Thread Pool
BASIC SYNCHRONIZATION
+ Synchronization Essentials
+ Locking
+ Thread Safety
+ Event Wait Handles
+ Synchronization Contexts
USING THREADS
+ Event-Based Asynch Pattern
+ BackgroundWorker
+ Interrupt and Abort
+ Safe Cancellation
+ Lazy Initialization
+ Thread-Local Storage
+ Timers
ADVANCED THREADING
+ Nonblocking Synchronization
+ Signaling with Wait and Pulse
+ The Barrier Class
+ Reader/Writer Locks
+ Suspend and Resume
+ Aborting Threads
PARALLEL PROGRAMMING
+ Parallel Programming
+ Why PFX?
+ PLINQ
+ The Parallel Class
+ Task Parallelism
+ Working with AggregateException
+ Concurrent Collections
+ SpinLock and SpinWait

También puede echar un vistazo al tutorial de Jon Skeet aquí: http://www.yoda.arachsys.com/csharp/threads/

Robert Harvey
fuente
3
Agrego la página c # mutlithreading de Jon Skeet a su respuesta: yoda.arachsys.com/csharp/threads
1
En segundo lugar, me gustaron los 5 capítulos de Albahari extremadamente útiles. Para practicar, aquí hay un ejercicio simple: cree un juego multijugador de tres en tres con WCF (si lo sabe) y una interfaz de usuario simple: intente actualizar los controles de la interfaz de usuario con las respuestas de cada jugador. ¿Has revisado el código de Firefox?
Narayana
¿Le importaría explicar más sobre lo que hace y por qué lo recomienda como respuesta a la pregunta que se hace? Las "respuestas de solo enlace" no son bienvenidas en Stack Exchange
mosquito
1
@gnat: pegué la tabla de contenido en mi respuesta.
Robert Harvey
El enlace al tutorial de Jon Skeet no parecía funcionar (estaba obteniendo una página de Azure 404): aquí hay un archivo: web.archive.org/web/20181010053742/http://www.yoda.arachsys.com / ...
ArtOfWarfare
13

Java Concurrency in Practice es uno de los mejores libros sobre subprocesos múltiples y concurrencia. Aunque todos los ejemplos en el libro están basados ​​en Java, este libro ofrece una explicación sólida del mundo MT. Me ayudó mucho cuando estaba desarrollando un sistema MT.

Sorantis
fuente
3
+1 buen libro. Y es la concurrencia de Java en la práctica, no la acción.
talonx
8

El Capítulo 11 del libro Intel Threading Building Blocks de James Reinders está dedicado a ejemplos de algoritmos y proyectos que hacen uso de la computación paralela (o programación paralela): un buscador de subcadenas, el juego de la vida, un tamiz de Eratóstenes, Matrix Multiply y luego otros temas más avanzados como filtrado de paquetes de red y juegos.

Xavier Nodet
fuente
4

Encontré la Programación concurrente en Windows de Joe Duffy muy útil. Hay mucha profundidad. No tira ningún golpe, por lo que realmente tiene una buena idea de cuántas maneras hay de dispararse en el pie. Me ayudó a ser cauteloso, que es el mejor consejo que puedo dar a cualquiera que empiece con aplicaciones MT.

Scott Whitlock
fuente
2

Hay una diferencia entre concurrencia y paralelismo. La concurrencia es el acto de hacer más de una cosa a la vez, como escribir en 2 archivos. El paralelismo es el acto de acelerar los programas mediante el uso de múltiples núcleos.

Aunque no hay almuerzo gratis cuando se trata de concurrencia, en paralelo el almuerzo ciertamente se está volviendo más libre, vea desarrollos como http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell

dan_waterworth
fuente
2
Tu distinción es incorrecta. La concurrencia es el acto de completar múltiples tareas en períodos de tiempo superpuestos sin hacer necesariamente más de una cosa en un momento dado . El paralelismo es el acto de hacer más de una cosa en un momento dado.
Asad Saeeduddin
Si se superponen, está en el proceso de hacer más de una cosa a la vez.
dan_waterworth
Si sus tiempos de inicio y finalización se superponen, esto no indica que ambas tareas continúen simultáneamente en un momento dado. Dadas dos listas de enteros para sumar, puede hacer que dos personas sumen cada lista de forma independiente y simultánea, que es simultánea y paralela, o puede sentarse y alternar entre resumir las entradas en una lista y las entradas en la otra lista, que es concurrente pero no paralela.
Asad Saeeduddin
No dije que estaban sucediendo simultáneamente. Dije haciendo más de una cosa a la vez.
dan_waterworth
Hacer más de una cosa a la vez es lo mismo que hacer dos cosas simultáneamente. Si ocurren varias cosas en un momento dado, ocurren simultáneamente.
Asad Saeeduddin
1

Este sitio tiene algunos buenos ejemplos de proyectos en general. www.planet-source-code.com

Simplemente elija un idioma y busque multihilo. Debería ver varios proyectos con código fuente disponible.

Pemdas
fuente
Me sorprende que esto no haya sido votado aún. Esta es la única respuesta que vi que se centra en la pregunta "cómo PRACTICAR la programación paralela y concurrente". Cada otra respuesta aborda la pregunta "cómo aprender los conceptos", que es una pregunta diferente.
Josiah