10. Estado compartido y thread pool
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
Un bug concurrente no requiere hardware desafortunado. Dos workers pueden leer el mismo valor, calcular el mismo sucesor y escribirlo. El ejemplo fuerza ese scheduling con una barrera: dos incrementos dejan 1.
Proteger el invariante, no la línea
Sección titulada «Proteger el invariante, no la línea»System.Threading.Lock es el primitivo moderno de .NET cuando varias lecturas y escrituras forman un invariante. Interlocked sirve para un contador atómico o una operación compare-and-swap. Una colección concurrente protege su propia operación, no una secuencia de negocio completa.
two increments without synchronization: 1Lock count: 10000Interlocked count: 10000AddOrUpdate count: 1000ConcurrentDictionary.AddOrUpdate puede invocar una factory varias veces bajo contención. Mantén las factories puras y separa los efectos en una operación idempotente.
El paralelismo es un presupuesto
Sección titulada «El paralelismo es un presupuesto»Parallel.ForEachAsync limita cuerpos activos con MaxDegreeOfParallelism. El programa observa dos cuerpos para un límite de dos. Es un presupuesto local, no backpressure end-to-end.
La starvation aparece cuando hilos bloqueados esperan trabajo que necesita esos mismos workers. Prefiere esperas asíncronas para I/O, limita el CPU y mide con dotnet-counters antes de aumentar mínimos.
Ejecutar la prueba
Sección titulada «Ejecutar la prueba»dotnet run --project code/csharp-advanced/Advanced -c Release -- l10La salida portable está en expected/l10.txt.
Ejercicios
Sección titulada «Ejercicios»- Sustituye el contador por total y checksum. Explica por qué dos llamadas
Interlockedno hacen atómico el par. - Pon una llamada HTTP en
GetOrAdd, cuenta las llamadas bajo contención y elimina el efecto. - Compara grados 2, 8 y 64 ante una dependencia limitada a cuatro llamadas.
Soluciones
- Protege ambos campos con un solo
Locko sustituye atómicamente un valor inmutable. Dos escrituras atómicas independientes exponen un estado intermedio. - La factory puede ejecutarse varias veces aunque gane un solo valor. El efecto debe ser idempotente y externo al primitivo de colección.
- El grado correcto viene del throughput y la latencia medidos; el número de CPU no define la capacidad de la dependencia.