Estructuras de datos para la programación paralelaData Structures for Parallel Programming

.NET Framework 4 incorpora varios tipos nuevos que son útiles en la programación paralela, incluido un conjunto de clases de colecciones simultáneas, primitivos de sincronización ligera y tipos para la inicialización diferida.The .NET Framework version 4 introduces several new types that are useful in parallel programming, including a set of concurrent collection classes, lightweight synchronization primitives, and types for lazy initialization. Puede usar estos tipos con cualquier código de aplicación multiproceso, como la biblioteca TPL y PLINQ.You can use these types with any multithreaded application code, including the Task Parallel Library and PLINQ.

Clases de colecciones simultáneasConcurrent Collection Classes

Las clases de colecciones del espacio de nombres System.Collections.Concurrent ofrece operaciones de agregar y quitar seguras para subprocesos que evitan los bloqueos siempre que sea posible y usan el bloqueo específico cuando los bloqueos son necesarios.The collection classes in the System.Collections.Concurrent namespace provide thread-safe add and remove operations that avoid locks wherever possible and use fine-grained locking where locks are necessary. A diferencia de las colecciones que se introdujeron en las versiones 1.0 y 2.0 de .NET Framework, una clase de colecciones simultáneas no requiere que el código de usuario adopte ningún bloqueo cuando accede a los elementos.Unlike collections that were introduced in the .NET Framework versions 1.0 and 2.0, a concurrent collection class does not require user code to take any locks when it accesses items. Las clases de colecciones simultáneas pueden mejorar significativamente el rendimiento a través de tipos como System.Collections.ArrayList y System.Collections.Generic.List<T> (con bloqueo implementado por el usuario) en escenarios donde varios subprocesos agregarán y quitarán elementos de una colección.The concurrent collection classes can significantly improve performance over types such as System.Collections.ArrayList and System.Collections.Generic.List<T> (with user-implemented locking) in scenarios where multiple threads add and remove items from a collection.

En la tabla siguiente se enumeran las nuevas clases de colecciones simultáneas:The following table lists the new concurrent collection classes:

TipoType DescripciónDescription
System.Collections.Concurrent.BlockingCollection<T> Proporciona capacidades de bloqueo y establecimiento de límites en colecciones seguras para subprocesos que implementan System.Collections.Concurrent.IProducerConsumerCollection<T>.Provides blocking and bounding capabilities for thread-safe collections that implement System.Collections.Concurrent.IProducerConsumerCollection<T>. Los subprocesos de productor se bloquean si no hay ranuras disponibles o si la colección está llena.Producer threads block if no slots are available or if the collection is full. Los subprocesos de consumidor se bloquean si la colección está vacía.Consumer threads block if the collection is empty. Este tipo también admite el acceso sin bloqueo de productores y consumidores.This type also supports non-blocking access by consumers and producers. BlockingCollection<T> puede utilizarse como una clase base o una memoria auxiliar para proporcionar el bloqueo y el establecimiento de límite de cualquier clase de colección que admite IEnumerable<T>.BlockingCollection<T> can be used as a base class or backing store to provide blocking and bounding for any collection class that supports IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Una implementación de contenedor segura para subprocesos que ofrece operaciones add y get escalables.A thread-safe bag implementation that provides scalable add and get operations.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Un tipo de diccionario simultáneo y escalable.A concurrent and scalable dictionary type.
System.Collections.Concurrent.ConcurrentQueue<T> Un tipo de cola FIFO simultánea y escalable.A concurrent and scalable FIFO queue.
System.Collections.Concurrent.ConcurrentStack<T> Un tipo de pila LIFO simultánea y escalable.A concurrent and scalable LIFO stack.

Para obtener más información, consulte Colecciones seguras para subprocesos.For more information, see Thread-Safe Collections.

Primitivos de sincronizaciónSynchronization Primitives

Los nuevos primitivos de sincronización del espacio de nombres System.Threading permiten un rendimiento más rápido y una simultaneidad específica al evitar mecanismos de bloqueo caros que se encuentran en el código multithreading heredado.The new synchronization primitives in the System.Threading namespace enable fine-grained concurrency and faster performance by avoiding expensive locking mechanisms found in legacy multithreading code. Algunos de los nuevos tipos, como System.Threading.Barrier y System.Threading.CountdownEvent, no tienen ningún homólogo en versiones anteriores de .NET Framework.Some of the new types, such as System.Threading.Barrier and System.Threading.CountdownEvent have no counterparts in earlier releases of the .NET Framework.

En la tabla siguiente se enumeran los nuevos tipos de sincronización:The following table lists the new synchronization types:

TipoType DescripciónDescription
System.Threading.Barrier Permite que varios subprocesos funcionen en un algoritmo en paralelo proporcionando un punto en el que cada tarea pueda señalizar su llegada y después bloquearse hasta que llegan algunas tareas o todas.Enables multiple threads to work on an algorithm in parallel by providing a point at which each task can signal its arrival and then block until some or all tasks have arrived. Para más información, consulte Barrier.For more information, see Barrier.
System.Threading.CountdownEvent Simplifica los escenarios de bifurcación y combinación proporcionando un mecanismo sencillo de encuentro.Simplifies fork and join scenarios by providing an easy rendezvous mechanism. Para más información, vea CountdownEvent.For more information, see CountdownEvent.
System.Threading.ManualResetEventSlim Un primitivo de sincronización similar a System.Threading.ManualResetEvent.A synchronization primitive similar to System.Threading.ManualResetEvent. ManualResetEventSlim es ligero, pero solo puede utilizarse para la comunicación dentro de un proceso.ManualResetEventSlim is lighter-weight but can only be used for intra-process communication.
System.Threading.SemaphoreSlim Un primitivo de sincronización que limita el número de subprocesos que acceden simultáneamente a un recurso o a un conjunto de recursos.A synchronization primitive that limits the number of threads that can concurrently access a resource or a pool of resources. Para más información, vea Semaphore y SemaphoreSlim.For more information, see Semaphore and SemaphoreSlim.
System.Threading.SpinLock Un primitivo de bloqueo de exclusión mutua genera el subproceso que trata de obtener un bloqueo para esperar en un bucle, o girar, durante un período de tiempo antes de producir su cuanto.A mutual exclusion lock primitive that causes the thread that is trying to acquire the lock to wait in a loop, or spin, for a period of time before yielding its quantum. En escenarios en los que se prevé que la espera del bloqueo sea corta, SpinLock ofrece mayor rendimiento que otras formas de bloqueo.In scenarios where the wait for the lock is expected to be short, SpinLock offers better performance than other forms of locking. Para más información, vea SpinLock.For more information, see SpinLock.
System.Threading.SpinWait Un tipo pequeño y ligero que girará durante un tiempo especificado y, finalmente, colocará el subproceso en un estado de espera si se supera el número de giros.A small, lightweight type that will spin for a specified time and eventually put the thread into a wait state if the spin count is exceeded. Para más información, vea SpinWait.For more information, see SpinWait.

Para obtener más información, consulte:For more information, see:

Clases de inicialización diferidaLazy Initialization Classes

Con la inicialización diferida, no se asigna la memoria para un objeto hasta que se necesite.With lazy initialization, the memory for an object is not allocated until it is needed. La inicialización diferida puede mejorar el rendimiento al distribuir las asignaciones de objetos uniformemente a lo largo de la duración de un programa.Lazy initialization can improve performance by spreading object allocations evenly across the lifetime of a program. Puede habilitar la inicialización diferida para cualquier tipo personalizado ajustando el tipo Lazy<T>.You can enable lazy initialization for any custom type by wrapping the type Lazy<T>.

En la tabla siguiente se enumeran los tipos de inicialización diferida:The following table lists the lazy initialization types:

TipoType DescripciónDescription
System.Lazy<T> Proporciona una inicialización diferida segura para subprocesos y ligera.Provides lightweight, thread-safe lazy-initialization.
System.Threading.ThreadLocal<T> Proporciona un valor inicializado de forma diferida por cada subproceso, donde cada subproceso invoca de forma diferida la función de inicialización.Provides a lazily-initialized value on a per-thread basis, with each thread lazily-invoking the initialization function.
System.Threading.LazyInitializer Proporciona métodos estáticos que evitan la necesidad de asignar una instancia de inicialización diferida y dedicada.Provides static methods that avoid the need to allocate a dedicated, lazy-initialization instance. En su lugar, usan referencias para garantizar que los destinos se han inicializado a medida que se accede a ellos.Instead, they use references to ensure targets have been initialized as they are accessed.

Para obtener más información, vea Inicialización diferida.For more information, see Lazy Initialization.

Agregar excepcionesAggregate Exceptions

El tipo System.AggregateException puede usarse para capturar varias excepciones que se producen simultáneamente en subprocesos independientes y devolverlas al subproceso combinado como una única excepción.The System.AggregateException type can be used to capture multiple exceptions that are thrown concurrently on separate threads, and return them to the joining thread as a single exception. Los tipos System.Threading.Tasks.Task y System.Threading.Tasks.Parallel y PLINQ usan AggregateException de forma amplia para este propósito.The System.Threading.Tasks.Task and System.Threading.Tasks.Parallel types and PLINQ use AggregateException extensively for this purpose. Para más información, vea Control de excepciones y Cómo: Controlar excepciones en una consulta PLINQ.For more information, see Exception Handling and How to: Handle Exceptions in a PLINQ Query.

Vea tambiénSee also