Share via


Estruturas de dados para a programação paralela

A.NET Framework versão 4 apresenta vários novos tipos que são úteis na programação paralela, incluindo um conjunto de classes de coleção simultâneas, primitivos de sincronização leve e tipos de inicialização lenta. Você pode usar esses tipos com qualquer código de aplicativo multithread, inclusive a biblioteca paralela de tarefas e o PLINQ.

Classes de coleção simultâneas

A coleção de classes de System.Collections.Concurrent namespace fornecem o thread-safe adicionar e remover operações evitar bloqueios, sempre que possível e usar o bloqueio refinado onde os bloqueios são necessários. Ao contrário das coleções que foram introduzidas na.NET Framework versões 1.0 e 2.0, uma classe de coleção simultâneas não requer código de usuário para fazer qualquer trava quando ele acessa os itens. As classes de coleção simultâneas podem melhorar significativamente o desempenho sobre tipos como System.Collections.ArrayList e System.Collections.Generic.List<T> (com bloqueio de implementados por usuário) em cenários onde vários segmentos adicionar e remover itens da coleção.

A tabela a seguir lista as novas classes de coleção simultâneas:

Tipo

Descrição

System.Collections.Concurrent.BlockingCollection<T>

Fornece o bloqueio e delimitadora recursos para coleções de thread-safe que implementam System.Collections.Concurrent.IProducerConsumerCollection<T>. Segmentos do produtor bloqueiam se nenhum slot disponível ou se a coleção está cheia. Threads de consumidor bloqueiam se a coleção está vazia. Esse tipo também oferece suporte a acesso sem bloqueio de consumidores e produtores. BlockingCollection<T>pode ser usado como uma classe base ou armazenamento para fornecer bloqueio e delimitadora de qualquer classe de coleção que ofereça suporte de backup IEnumerable<T>.

System.Collections.Concurrent.ConcurrentBag<T>

Uma implementação de bolsa de thread-safe fornece dimensionável, adicionar e operações de obtenção.

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>

Um tipo de dicionário simultâneas e dimensionável.

System.Collections.Concurrent.ConcurrentQueue<T>

Uma fila de FIFO simultânea e dimensionável.

System.Collections.Concurrent.ConcurrentStack<T>

Uma pilha LIFO simultânea e dimensionável.

Para obter mais informações, consulte Coleções de thread-Safe..

Primitivos de sincronização

Os novos primitivos de sincronização no System.Threading namespace habilitar simultaneidade refinada e desempenho mais rápido, evitando os mecanismos de bloqueio caros encontrados no código de multithreading herdados. Alguns dos novos tipos, como System.Threading.Barrier e System.Threading.CountdownEvent não tem nenhum contrapartes nas versões anteriores do.NET Framework.

A tabela a seguir lista os novos tipos de sincronização:

Tipo

Descrição

System.Threading.Barrier

Permite que vários threads trabalhar em um algoritmo em paralelo, fornecendo um ponto em que cada tarefa pode sinalizar sua chegada e bloquear o até que chegaram algumas ou todas as tarefas. Para obter mais informações, consulte Barreira (.NET Framework).

System.Threading.CountdownEvent

Simplifica os cenários de bifurcação e associação, fornecendo um mecanismo fácil rendezvous. Para obter mais informações, consulte CountdownEvent.

System.Threading.ManualResetEventSlim

Um primitivo de sincronização, semelhante a System.Threading.ManualResetEvent. ManualResetEventSlimé leve, mas só pode ser usado para comunicação direcionada. Para obter mais informações, consulte ManualResetEvent e ManualResetEventSlim.

System.Threading.SemaphoreSlim

Um primitivo de sincronização que limita o número de threads simultaneamente pode acessar um recurso ou um pool de recursos. Para obter mais informações, consulte Semáforo e 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 de espera em um loop, ou spin, por um período de tempo antes produzindo seu quantum. Em cenários onde a espera pelo bloqueio deve ser curto, SpinLock oferece melhor desempenho que outras formas de bloqueio. Para obter mais informações, consulte SpinLock.

System.Threading.SpinWait

Um tipo de pequeno e leve que irá girar por um período especificado e, eventualmente, coloca o segmento em um estado de espera se a contagem de rotações for excedida. Para obter mais informações, consulte SpinWait.

Para obter mais informações, consulte:

Classes de inicialização lenta

Com a inicialização lenta, a memória de um objeto não está alocada até que ele é necessário. Inicialização lenta pode melhorar o desempenho pela propagação das alocações de objeto uniformemente em toda a vida útil de um programa. Você pode habilitar a inicialização ociosa para qualquer tipo personalizado por quebra automática do tipo Lazy<T>.

A tabela a seguir lista os tipos de inicialização lenta:

Tipo

Descrição

System.Lazy<T>

Fornece um leve, thread-safe-inicialização lenta.

System.Threading.ThreadLocal<T>

Fornece um valor inicializado em uma base por thread, cada thread ociosamente-invocar a função de inicialização.

System.Threading.LazyInitializer

Fornece métodos estáticos que evitar a necessidade de alocar uma instância dedicada, chamada de inicialização lenta. Em vez disso, eles usam referências para garantir que os destinos foram inicializados como eles são acessados.

Para obter mais informações, consulte Inicialização lenta.

Agregadas exceções

O System.AggregateException tipo pode ser usado para capturar exceções múltiplas, que são lançadas simultaneamente em threads separados e retorná-los para o segmento de ingresso como uma única exceção. O System.Threading.Tasks.Task e System.Threading.Tasks.Parallel tipos e PLINQ usam AggregateException extensivamente para essa finalidade. Para obter mais informações, consulte Como: Manipular exceções lançadas por tarefas e Como: Tratar exceções em uma consulta PLINQ.

Consulte também

Referência

System.Collections.Concurrent

System.Threading

Conceitos

Programação em paralela a.NET Framework