Estruturas de dados para programação paralelaData Structures for Parallel Programming

O .NET fornece vários tipos úteis em programação paralela, incluindo um conjunto de classes de coleção simultâneas, primitivos de sincronização leves e tipos de inicialização lenta..NET provides several types that are useful in parallel programming, including a set of concurrent collection classes, lightweight synchronization primitives, and types for lazy initialization. Você pode usar esses tipos com qualquer código de aplicativo multithread, incluindo PLINQ e biblioteca de paralelismo de tarefas.You can use these types with any multithreaded application code, including the Task Parallel Library and PLINQ.

Classes de coleção simultâneasConcurrent Collection Classes

As classes de coleção no namespace System.Collections.Concurrent fornecem operações de adição e remoção thread-safe que, sempre que possível, evitam bloqueios e usam o bloqueio refinado quando os bloqueios forem necessários.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. Uma classe de coleção simultânea não exige que o código do usuário assuma nenhum bloqueio ao acessar itens.A concurrent collection class does not require user code to take any locks when it accesses items. As classes de coleção simultânea podem melhorar consideravelmente o desempenho em tipos como System.Collections.ArrayList e System.Collections.Generic.List<T> (com bloqueio implementado pelo usuário) em cenários nos quais vários threads adicionam e removem itens de uma coleção.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.

A tabela a seguir lista as classes de coleção simultâneas:The following table lists the concurrent collection classes:

TipoType DescriçãoDescription
System.Collections.Concurrent.BlockingCollection<T> Fornece funcionalidades de bloqueio e delimitação para coleções thread-safe que implementam System.Collections.Concurrent.IProducerConsumerCollection<T>.Provides blocking and bounding capabilities for thread-safe collections that implement System.Collections.Concurrent.IProducerConsumerCollection<T>. Os threads de produtor são bloqueados se nenhum slot estiver disponível, ou se a coleção estiver cheia.Producer threads block if no slots are available or if the collection is full. Threads de consumidor são bloqueados se a coleção estiver vazia.Consumer threads block if the collection is empty. Esse tipo também oferece suporte ao acesso sem bloqueio de produtores e consumidores.This type also supports non-blocking access by consumers and producers. BlockingCollection<T> pode ser usado como uma classe base ou repositório de backup para fornecer bloqueio e limitação a qualquer classe de coleção que ofereça suporte a 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> Uma implementação de recipiente thread-safe que fornece operações de adição e get escalonáveis.A thread-safe bag implementation that provides scalable add and get operations.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Um tipo de dicionário simultâneo e escalonável.A concurrent and scalable dictionary type.
System.Collections.Concurrent.ConcurrentQueue<T> Uma fila FIFO simultânea e escalonável.A concurrent and scalable FIFO queue.
System.Collections.Concurrent.ConcurrentStack<T> Uma pilha LIFO simultânea e escalonável.A concurrent and scalable LIFO stack.

Para obter mais informações, veja Coleções thread-safe.For more information, see Thread-Safe Collections.

Primitivos de sincronizaçãoSynchronization Primitives

Os primitivos de sincronização no System.Threading namespace permitem uma simultaneidade refinada e desempenho mais rápido, evitando mecanismos de bloqueio caros encontrados no código multithread herdado.The synchronization primitives in the System.Threading namespace enable fine-grained concurrency and faster performance by avoiding expensive locking mechanisms found in legacy multithreading code.

A tabela a seguir lista os tipos de sincronização:The following table lists the synchronization types:

TipoType DescriçãoDescription
System.Threading.Barrier Permite que vários threads funcionem em um algoritmo em paralelo fornecendo um ponto em que cada tarefa pode sinalizar sua chegada e, depois, gerar um bloqueio até que algumas ou todas as tarefas tenham chegado.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 saber mais, consulte Barreira.For more information, see Barrier.
System.Threading.CountdownEvent Simplifica cenários de bifurcação e junção fornecendo um mecanismo fácil de encontro.Simplifies fork and join scenarios by providing an easy rendezvous mechanism. Para saber mais, confira CountdownEvent.For more information, see CountdownEvent.
System.Threading.ManualResetEventSlim Um primitivo de sincronização semelhante a System.Threading.ManualResetEvent.A synchronization primitive similar to System.Threading.ManualResetEvent. ManualResetEventSlim é leve, mas só pode ser usado para comunicação entre processos.ManualResetEventSlim is lighter-weight but can only be used for intra-process communication.
System.Threading.SemaphoreSlim Um primitivo de sincronização que limita o número de threads que podem acessar simultaneamente um recurso ou um pool de recursos.A synchronization primitive that limits the number of threads that can concurrently access a resource or a pool of resources. Para saber mais, confira Semaphore e SemaphoreSlim.For more information, see Semaphore and SemaphoreSlim.
System.Threading.SpinLock Um primitivo de bloqueio de exclusão mútua que faz com que o thread que está tentando adquirir o bloqueio aguarde em um loop, ou rotação, durante um período antes de gerar seu quantum.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. Em cenários nos quais a espera pelo bloqueio deve ser curta, SpinLock oferece um desempenho melhor do que outras formas de bloqueio.In scenarios where the wait for the lock is expected to be short, SpinLock offers better performance than other forms of locking. Para saber mais, veja SpinLock.For more information, see SpinLock.
System.Threading.SpinWait Um tipo de pequeno e leve que girará por um tempo especificado e, no final, colocará o thread em um estado de espera se a contagem de rotações for ultrapassada.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 saber mais, veja SpinWait.For more information, see SpinWait.

Para obter mais informações, consulte:For more information, see:

Classes de inicialização lentaLazy Initialization Classes

Com a inicialização lenta, a memória de um objeto não é alocada até que seja necessário.With lazy initialization, the memory for an object is not allocated until it is needed. A inicialização lenta pode melhorar o desempenho distribuindo as alocações de objeto uniformemente entre o tempo de vida de um programa.Lazy initialization can improve performance by spreading object allocations evenly across the lifetime of a program. Você pode habilitar a inicialização lenta para qualquer tipo personalizado encapsulando o tipo Lazy<T>.You can enable lazy initialization for any custom type by wrapping the type Lazy<T>.

A tabela a seguir lista os tipos de inicialização lenta:The following table lists the lazy initialization types:

TipoType DescriçãoDescription
System.Lazy<T> Fornece inicialização lenta, leve e thread-safe.Provides lightweight, thread-safe lazy-initialization.
System.Threading.ThreadLocal<T> Fornece um valor com inicialização lenta em uma base por thread, com cada thread invocando lentamente a função de inicialização.Provides a lazily-initialized value on a per-thread basis, with each thread lazily-invoking the initialization function.
System.Threading.LazyInitializer Fornece métodos estáticos que evitam a necessidade de alocar uma instância dedicada de inicialização lenta.Provides static methods that avoid the need to allocate a dedicated, lazy-initialization instance. Em vez disso, usam referências para garantir que os destinos sejam inicializados conforme são acessados.Instead, they use references to ensure targets have been initialized as they are accessed.

Para obter mais informações, veja Inicialização lenta.For more information, see Lazy Initialization.

Agregar exceçõesAggregate Exceptions

O tipo System.AggregateException pode ser usado para capturar várias exceções lançadas simultaneamente em threads separados e retorná-las para o thread associado como uma única exceção.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. Os tipos System.Threading.Tasks.Task e System.Threading.Tasks.Parallel e o PLINQ usam AggregateException extensivamente para essa finalidade.The System.Threading.Tasks.Task and System.Threading.Tasks.Parallel types and PLINQ use AggregateException extensively for this purpose. Para saber mais, veja Tratamento de exceções e Como tratar exceções em uma consulta PLINQ.For more information, see Exception Handling and How to: Handle Exceptions in a PLINQ Query.

Consulte tambémSee also