Partilhar via


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).

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.

Consulte também