Compartilhar via


Paralelismo de dados (biblioteca paralela de tarefas)

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 (Biblioteca Paralela de Tarefas) dá suporte ao paralelismo de dados por meio 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, assim como escreveria um loop sequencial. Você não precisa criar threads ou listar itens de trabalho. Nos loops básicos, você não precisa usar bloqueios. O TPL cuida de todas as tarefas de baixo nível para você. Para obter informações detalhadas sobre o uso de Parallel.For e Parallel.ForEach, baixe o documento Padrões para Programação Paralela: Compreendendo e Aplicando Padrões Paralelos com o .NET Framework 4. O exemplo de código a seguir mostra um loop simples foreach e seu equivalente paralelo.

Observação

Esta documentação usa expressões lambda para definir representantes no 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.

Observação

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.

Os métodos Parallel.For e Parallel.ForEach têm várias sobrecargas que permitem parar ou interromper a execução do loop, monitorar o estado do loop em outros threads, manter o estado local do thread, finalizar objetos thread-local, controlar o grau de concorrência e assim por diante. Os tipos auxiliares que habilitam essa funcionalidade incluem ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, e CancellationTokenSource.

Para obter mais informações, consulte Padrões de Programação Paralela: Noções básicas e aplicando padrões paralelos com o .NET Framework 4.

Há suporte para paralelismo de dados com sintaxe declarativa ou semelhante a consulta por PLINQ. Para obter mais informações, consulte Parallel LINQ (PLINQ).

Título Descrição
Como: Gravar um loop Parallel.For simples Descreve como gravar um loop For sobre qualquer matriz ou coleção de origem IEnumerable<T> indexável.
Como: Gravar um loop Parallel.ForEach simples Descreve como gravar um loop ForEach sobre qualquer coleção de origem IEnumerable<T>.
Como parar ou sair de um loop Parallel.For Descreve como parar ou interromper um loop paralelo para que todos os encadeamentos sejam informados da ação.
Como: Gravar um loop Parallel.For com variáveis locais de thread Descreve como escrever um For loop no qual cada thread mantém uma variável privada que não está visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop for concluído.
Como escrever um loop Parallel.ForEach com variáveis de Partition-Local Descreve como escrever um ForEach loop no qual cada thread mantém uma variável privada que não está visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop for 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 Apresenta a programação paralela no .NET Framework.

Consulte também