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 |
---|---|
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>. |
|
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. |
Uma fila de FIFO simultânea e dimensionável. |
|
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 |
---|---|
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). |
|
Simplifica os cenários de bifurcação e associação, fornecendo um mecanismo fácil rendezvous. Para obter mais informações, consulte CountdownEvent. |
|
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. |
|
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. |
|
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. |
|
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 |
---|---|
Fornece um leve, thread-safe-inicialização lenta. |
|
Fornece um valor inicializado em uma base por thread, cada thread ociosamente-invocar a função de inicialização. |
|
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.