Paralelismo de dados (biblioteca paralela de tarefas)
O paralelismo de dados refere-se a cenários em que a mesma operação é executada simultaneamente (ou seja, em paralelo) em elementos em uma coleção ou matriz de origem. Em operações paralelas de dados, a coleção de origem é particionada para que vários threads possam operar em diferentes segmentos simultaneamente.
A TPL (Task Parallel Library) suporta paralelismo de dados através da System.Threading.Tasks.Parallel classe. Essa classe fornece implementações paralelas baseadas em método de loops for e foreach (For
e For Each
no Visual Basic). Você escreve a lógica de loop para um Parallel.For ou Parallel.ForEach loop da mesma forma que escreveria um loop sequencial. Não é necessário criar threads ou itens de trabalho em fila. Em loops básicos, você não precisa tomar fechaduras. A TPL lida com todo o trabalho de baixo nível para você. Para obter informações detalhadas sobre o uso de Parallel.For e Parallel.ForEach, baixe o documento Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. O exemplo de código a seguir mostra um loop simples foreach
e seu equivalente paralelo.
Nota
Esta documentação usa expressões lambda para definir delegados na TPL. Se você não estiver familiarizado com expressões lambda em C# ou Visual Basic, consulte Expressões lambda em PLINQ e TPL.
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
Quando um loop paralelo é executado, o TPL particiona a fonte de dados para que o loop possa operar em várias partes simultaneamente. Nos bastidores, o Agendador de Tarefas particiona a tarefa com base nos recursos do sistema e na carga de trabalho. Quando possível, o agendador redistribui o trabalho entre vários threads e processadores se a carga de trabalho ficar desequilibrada.
Nota
Você também pode fornecer seu próprio particionador ou agendador personalizado. Para obter mais informações, consulte Particionadores personalizados para PLINQ e TPL e Agendadores de tarefas.
Ambos os Parallel.For métodos e Parallel.ForEach têm várias sobrecargas que permitem parar ou quebrar a execução do loop, monitorar o estado do loop em outros threads, manter o estado thread-local, finalizar objetos thread-local, controlar o grau de simultaneidade e assim por diante. Os tipos auxiliares que habilitam essa funcionalidade incluem ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationTokene CancellationTokenSource.
Para obter mais informações, consulte Padrões para programação paralela: compreendendo e aplicando padrões paralelos com o .NET Framework 4.
O paralelismo de dados com sintaxe declarativa ou semelhante a uma consulta é suportado pelo PLINQ. Para obter mais informações, consulte Parallel LINQ (PLINQ).
Tópicos Relacionados
Title | Description |
---|---|
Como: Escrever um loop Parallel.For simples | Descreve como gravar um For loop em qualquer matriz ou coleção de fontes indexáveis IEnumerable<T> . |
Como: Escrever um loop Parallel.ForEach simples | Descreve como escrever um ForEach loop sobre qualquer IEnumerable<T> coleção de origem. |
Como: Parar ou quebrar de um loop Parallel.For | Descreve como parar ou quebrar de um loop paralelo para que todos os threads sejam informados da ação. |
Como: Escrever um loop Parallel.For com variáveis Thread-Local | Descreve como escrever um For loop no qual cada thread mantém uma variável privada que não é visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop é concluído. |
Como: Escrever um loop Parallel.ForEach com variáveis de partição local | Descreve como escrever um ForEach loop no qual cada thread mantém uma variável privada que não é visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop é concluído. |
Como: Cancelar um loop Parallel.For ou ForEach | Descreve como cancelar um loop paralelo usando um System.Threading.CancellationToken |
Como: Acelerar corpos de loop pequenos | Descreve uma maneira de acelerar a execução quando um corpo de loop é muito pequeno. |
Biblioteca paralela de tarefas (TPL) | Fornece uma visão geral da Biblioteca Paralela de Tarefas. |
Programação paralela | Introduz a programação paralela no .NET Framework. |