SlideShare uma empresa Scribd logo
1 de 45
.NET
Threading
INTRODUÇÃO A PROGRAMAÇÃO CONCORRENTE
Processos vs Threads
 Processos são containers mapeados para um endereço de memoria no
qual outros processos não tem permissão de leitura
Memoria Processos
Threads
 Roda todo ou parte do código dentro de um
processo
 Tem acesso a um pedaço ou toda memoria
mapeada para o processo
 Toda thread tem sua propina copia da
callstack e registradores da CPU.
 Um processo sem nenhuma thread é
finalizado, já que não esta realizando nenhum
execução.
Vantagens do uso de multi-threading
 Possibilidade de escalar as operações da CPU a partir de paralelização de
processamento de dados (assumindo um hardware com multi-core/multi-
processadores)
 Realizar operações variadas enquanto esperamos por operações de I/O
finalizem.
 Manter uma UI responsiva
Preocupações com muti-threading
 Adiciona complexidade ao programa
 Linhas de código
 Leitura
 Testabilidade
 Execução mais lenta em maquinas com
um core ou processador
Como iniciar um thread?
Como iniciar thread com parâmetros
Threads com métodos de instancia
Tempo de vida de uma thread
 Uma thread para quando
 O método da thread retorna
 Ocorre um exception não tratada (synchronous exception)
 Outra thread para ela com “Interrupt”ou “Abort” (asynchronous exception)
A propriedade IsAlive prove um snapshot instantaneo do status da thread
IsAlive == false
Como parar uma thread?
Idealmente é ter uma logica pré-definida para abortar a execução
Thread-pool
 Prove uma forma em que as threads são
emprestadas para operações
concorrentes que sejam rápidas.
 CLR prove uma thread-pool por
processo.
 Threads são adicionadas ou removidas
de acordo com a demanda
 Permite que o custo de criar e matar
threads seja reduzido durante a vida do
processo
 Por padrão tem a propriedade
IsBackground definida como `true`
 Usado de implicitamente forma padrão
ao utilizar Async I/O, Delegate.Invoke,
Parallel.For, PLINQ
Parallel.For e PLINQ
Usam por padrão o threadpool
ThreadLocal State
“System.NotSupportedException -> WebClient does not support concurrent I/O operations.”
ThreadLocal State
Com isso seu programa instancia mais de 100 WebClients, seu programa lança uma exceção que
informa que seus webclients estão dando timeout. Você percebe que é porque sua máquina não
está executando um sistema operacional de servidor, e há um limite máximo no número de
conexões simultâneas.
ThreadLocal State
Nesse caso, cada operação de acesso a dados é inteiramente independente um do outro.
O uso do thread-local state nos permitiu garantir que gerássemos apenas tantos objetos
WebClient quanto necessário, e que cada WebClient pertence a thread que o gerou.
ThreadLocal State
O mesmo é conseguido com PLINQ utilizando o ThreadLocal<>, porém é importante ressaltar
que, em qualquer cenário, usando o tipo ThreadLocal<> é mais custoso do que usar o overload
de ThreadLocalState do Parallel.ForEach
Sincronização de threads
 A maior parte dos recursos dentro de um programa não são pensados
para serem usados de forma concorrente.
 Collections (array, list, dictionary, etc)
 Files
 Mesmo inteiros
Oque deveria ser exibido?
Oque será exibido?
Sessões criticas
 Uma sessão critica é uma região do código que ira acessar um recurso
compartilhado:
Race
Condition
Solução 1: Atomic updates
 Maior parte dos processadores suportam atomic updates
Solução 2: Particionamento
Solução 3: Wait Based Synchronization
 Quando threads necessitam de acessar o mesmo recurso que não pode ser
particionado (adicionar ou remover um no de uma lista, ou manipular o
mesmo arquivo)
 Algumas vezes queremos que uma thread esteja block ate algum evento
ocorrer.
 A casos que os dados dependem de um passo anterior inviabilizando
particionamento.
 Quando o input de uma thread depende do output de outra
 Calcular a sequencia de Fibonacci
 Sequence[0] = Sequence[1] = 1
 Sequence[n] = Sequence[n-1]+Sequence[n-2]
Wait-Based Thread Synchronization
Wait-Based Thread Synchronization
Primitives
 Existem vários primitivos para controle de threads no CLR
System.Threading:
 Monitor
 Mutex
 ReaderWriterLockSlim
 ManualResetEvent, AutoResetEvent
 Semaphore, SlimSemaphore
 Os 3 primeiros compartilham o mesmo modelo de uso:
 Faz uma chamada para adquirir o owner do “lock”
 Usa o recurso compartilhado que o “lock” designado visa proteger
 Faz um chamada para liberar o “lock” assim que o recurso não é mais
necessário
System.Threading.Monitor
 Monitor garante acesso exclusivo a um recurso
 CLR permite apenas uma thread entrar no contexto do
monitor por vez
 Outras threads que tentarem entrar irão ficar bloqueada
 Assim que o recurso for liberado a próxima thread na
espera ira adquirir para si o acesso exclusivo ao recurso
Monitors no CLR
 Metodos do monitor operam em cima de uma referencia de um objeto
 Qualquer referencia de objeto no HEAP pode potencialmente ser associado a
um lock
Monitor: Tratar exceptions
C# Monitor syntax sugar
Hold & Wait
 As vezes uma thread precisa e esperar alguma coisa enquanto segura um
lock
 Em scenarios de producer/consumer é comum ter que lidar com
gerenciamento de disponibilidade de recursos.
 Mutipla aquisição de locks
Hold & Wait com Monitors
ManualResetEvent
 Controle de fluxo
 Precisa ser
explicitamente
resetado
AutoResetEvent
 Controle de fluxo
 É resetado a cada
WaitOne
DEADLOCK
DEADLOCK
 Deadlocks podem ocorrer a qualquer momento em que esteja numa
situação de Hold & Wait
 Enquento segura um lock a thread tenta obter outro lock
Deadlocks podem ocorrer mas não necessariamente vão ocorrer
Deadlocks são possíveis mas não necessariamente prováveis (a probabilidade
aumenta de acordo com o # de threads/processadores/cores)
Deadlock podem talvez ser temporário caso seja utilizado timeouts nas aquisições
de lock
COMO ACONTECE?
Mutexes
 Um Mutex é um objeto de Kernel (Sytem.Threading.Mutex)
 Suporta timeout em aquisições de lock
 Nomeável, permite sincronização cross-process na mesma maquina
 Habilita o uso múltipla aquisições de lock com de deadlock-free via
WaitHandle.WaitAll
 Tradeoffs
 Chamadas de aquisições e liberação de locks sempre ocorrem em kernel mode
 Objetos de kernel devem ser fechados assim que não mais necessários (ocorre
automaticamente mas depende do GC)
Código propicio a deadlock
Sem deadlock
Semaphore
 Funciona de forma similar ao Monitor ou Mutex, porem ele delimita
quantas threads podem acessar uma sessão critica ao mesmo tempo.
 É como uma balada como uma fila, aonde as pessoas na fila esperam uma
pessoa sair da balada para entrar.
 System.Threading.SemaphoreSlim é mais leve, não faz chamdas de kernel, para
ser usado em apenas um processo.
 System.Threading.Semaphore pode ser nomeado e funciona entre processos
 Não tem garantia de ordem
Semaphore
ReaderWriterLockSlim
 Possui trem modos : Read, Write e Ungradeable
 Muitas threads podem estar simutaneamente em modo Read
 Apenas uma pode entrar em modo Ungradeable mas outras threads
podem entrar em modo read
 Apenas uma Thread pode entrar em modo write, e nenhuma outra thread
pode adquirir um lock
Concurrent Collections
Immutable Collections
 NuGet System.Collection.Immutable
 Thread Safe por definição
Keyword : volatile
 Não reordena instruções na memoria
 “Garante” que a leitura do valor mais novo será realizada
 Resolvia o problema de double null check em versões do .NET < 2
 Deve ser evitado
 Apenas utilizado em casos em que o cenario de locks não esta atendendo
a performance desejada
E o TPL? Async await?
 IMPORTANTE: Assíncrono não é equivalente a paralelo.
 A classe Task ou ValueTask não necessariamente estão vinculadas com
threads.
 O Método estático Task.Run() ou Task.Factory.StartNew() sempre inicia
uma thread, e é a forma recomendada para se criar threads no .NET
moderno.
 Mais sobre isso na proxima, sobre .NET Assincrono

Mais conteúdo relacionado

Mais procurados

Gerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoGerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoAlexandre Duarte
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsEvandro Júnior
 
Gerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMPGerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMPMauro Tapajós
 
Sistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockSistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockWellington Oliveira
 
Processos threads senai
Processos threads senaiProcessos threads senai
Processos threads senaiCarlos Melo
 
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Felipe Santos
 
Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Cristiano Pires Martins
 
(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09Norton Trevisan Roman
 
Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosThiago Poiani
 
(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12Norton Trevisan Roman
 
Docker e outras ferramentas Devops
Docker e outras ferramentas DevopsDocker e outras ferramentas Devops
Docker e outras ferramentas DevopsCristian Trucco
 
(ACH2044) Sistemas Operacionais - Aula 10
(ACH2044) Sistemas Operacionais - Aula 10(ACH2044) Sistemas Operacionais - Aula 10
(ACH2044) Sistemas Operacionais - Aula 10Norton Trevisan Roman
 
Gerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMPGerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMPAndré Déo
 
Gerências de Processos: Escalonamento de CPU
Gerências de Processos: Escalonamento de CPUGerências de Processos: Escalonamento de CPU
Gerências de Processos: Escalonamento de CPUAlexandre Duarte
 
(ACH2044) Sistemas Operacionais - Aula 02
(ACH2044) Sistemas Operacionais - Aula 02(ACH2044) Sistemas Operacionais - Aula 02
(ACH2044) Sistemas Operacionais - Aula 02Norton Trevisan Roman
 

Mais procurados (20)

Gerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoGerências de Processos: Sincronização
Gerências de Processos: Sincronização
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e Threads
 
Criando Aplicações Resilientes
Criando Aplicações ResilientesCriando Aplicações Resilientes
Criando Aplicações Resilientes
 
Gerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMPGerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMP
 
Apt_vagrant_chef_olavo_queiroz
Apt_vagrant_chef_olavo_queirozApt_vagrant_chef_olavo_queiroz
Apt_vagrant_chef_olavo_queiroz
 
Sistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockSistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 Deadlock
 
Processos threads senai
Processos threads senaiProcessos threads senai
Processos threads senai
 
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
 
Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1
 
05tolerancia
05tolerancia05tolerancia
05tolerancia
 
(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09
 
[Tutorial] metasploit
[Tutorial] metasploit[Tutorial] metasploit
[Tutorial] metasploit
 
Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e Semáforos
 
(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12
 
Docker e outras ferramentas Devops
Docker e outras ferramentas DevopsDocker e outras ferramentas Devops
Docker e outras ferramentas Devops
 
(ACH2044) Sistemas Operacionais - Aula 10
(ACH2044) Sistemas Operacionais - Aula 10(ACH2044) Sistemas Operacionais - Aula 10
(ACH2044) Sistemas Operacionais - Aula 10
 
Processos e threads cap 02 (i unidade)
Processos e threads   cap 02 (i unidade)Processos e threads   cap 02 (i unidade)
Processos e threads cap 02 (i unidade)
 
Gerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMPGerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMP
 
Gerências de Processos: Escalonamento de CPU
Gerências de Processos: Escalonamento de CPUGerências de Processos: Escalonamento de CPU
Gerências de Processos: Escalonamento de CPU
 
(ACH2044) Sistemas Operacionais - Aula 02
(ACH2044) Sistemas Operacionais - Aula 02(ACH2044) Sistemas Operacionais - Aula 02
(ACH2044) Sistemas Operacionais - Aula 02
 

Semelhante a Net - Threads

Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreadingBianca Dantas
 
Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Charles Fortes
 
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadDelphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadMario Guedes
 
Componentes do Sistema operacional
Componentes do Sistema operacional Componentes do Sistema operacional
Componentes do Sistema operacional Rodrigo Rodrigues
 
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...rafaelov
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveiselliando dias
 
Arquitetura de Software - Concorrência
Arquitetura de Software - ConcorrênciaArquitetura de Software - Concorrência
Arquitetura de Software - ConcorrênciaAndré Faria Gomes
 
Apresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLApresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLJohnes Castro
 
GDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosGDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosCaio Cutrim
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis L Presciliano
 
Coroutine e concorrência python
Coroutine e concorrência   python Coroutine e concorrência   python
Coroutine e concorrência python Kaueh Moreno
 
Trabalhando com Threads em JAVA
Trabalhando com Threads em JAVATrabalhando com Threads em JAVA
Trabalhando com Threads em JAVAMarcio Palheta
 
12/03/2010 - Sistemas Operacionais Aula3
12/03/2010 - Sistemas Operacionais Aula312/03/2010 - Sistemas Operacionais Aula3
12/03/2010 - Sistemas Operacionais Aula3Universal.org.mx
 
Async/Await Pattern in C#
Async/Await Pattern in C#Async/Await Pattern in C#
Async/Await Pattern in C#Leandro Silva
 
Java recursos avançados - multithreading
Java   recursos avançados - multithreadingJava   recursos avançados - multithreading
Java recursos avançados - multithreadingArmando Daniel
 
Processos e threads
Processos e threadsProcessos e threads
Processos e threadsSilvino Neto
 

Semelhante a Net - Threads (20)

Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreading
 
Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Threads - .Net Framework 4.0
Threads - .Net Framework 4.0
 
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadDelphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
 
Componentes do Sistema operacional
Componentes do Sistema operacional Componentes do Sistema operacional
Componentes do Sistema operacional
 
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
 
Arquitetura de Software - Concorrência
Arquitetura de Software - ConcorrênciaArquitetura de Software - Concorrência
Arquitetura de Software - Concorrência
 
Apresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLApresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQL
 
GDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosGDG NodeJS Sem Segredos
GDG NodeJS Sem Segredos
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Java 13
Java 13Java 13
Java 13
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
12 threads
12 threads12 threads
12 threads
 
Coroutine e concorrência python
Coroutine e concorrência   python Coroutine e concorrência   python
Coroutine e concorrência python
 
Trabalhando com Threads em JAVA
Trabalhando com Threads em JAVATrabalhando com Threads em JAVA
Trabalhando com Threads em JAVA
 
12/03/2010 - Sistemas Operacionais Aula3
12/03/2010 - Sistemas Operacionais Aula312/03/2010 - Sistemas Operacionais Aula3
12/03/2010 - Sistemas Operacionais Aula3
 
Async/Await Pattern in C#
Async/Await Pattern in C#Async/Await Pattern in C#
Async/Await Pattern in C#
 
Java recursos avançados - multithreading
Java   recursos avançados - multithreadingJava   recursos avançados - multithreading
Java recursos avançados - multithreading
 
Processos e threads
Processos e threadsProcessos e threads
Processos e threads
 
Processos
ProcessosProcessos
Processos
 

Mais de Lucas Teles

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijaoLucas Teles
 
Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Lucas Teles
 
Fabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishFabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishLucas Teles
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoLucas Teles
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Lucas Teles
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoLucas Teles
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticosLucas Teles
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxLucas Teles
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooksLucas Teles
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elmLucas Teles
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdcLucas Teles
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functionsLucas Teles
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedoresLucas Teles
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareLucas Teles
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.formsLucas Teles
 

Mais de Lucas Teles (17)

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijao
 
Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​
 
Fabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishFabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com Elmish
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijão
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminho
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticos
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptx
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooks
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elm
 
C# 8 e além
C# 8 e alémC# 8 e além
C# 8 e além
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functions
 
F# para devs c#
F# para devs c#F# para devs c#
F# para devs c#
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedores
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo software
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.forms
 

Net - Threads

  • 2. Processos vs Threads  Processos são containers mapeados para um endereço de memoria no qual outros processos não tem permissão de leitura Memoria Processos
  • 3. Threads  Roda todo ou parte do código dentro de um processo  Tem acesso a um pedaço ou toda memoria mapeada para o processo  Toda thread tem sua propina copia da callstack e registradores da CPU.  Um processo sem nenhuma thread é finalizado, já que não esta realizando nenhum execução.
  • 4. Vantagens do uso de multi-threading  Possibilidade de escalar as operações da CPU a partir de paralelização de processamento de dados (assumindo um hardware com multi-core/multi- processadores)  Realizar operações variadas enquanto esperamos por operações de I/O finalizem.  Manter uma UI responsiva
  • 5. Preocupações com muti-threading  Adiciona complexidade ao programa  Linhas de código  Leitura  Testabilidade  Execução mais lenta em maquinas com um core ou processador
  • 6. Como iniciar um thread?
  • 7. Como iniciar thread com parâmetros
  • 8. Threads com métodos de instancia
  • 9. Tempo de vida de uma thread  Uma thread para quando  O método da thread retorna  Ocorre um exception não tratada (synchronous exception)  Outra thread para ela com “Interrupt”ou “Abort” (asynchronous exception) A propriedade IsAlive prove um snapshot instantaneo do status da thread IsAlive == false
  • 10. Como parar uma thread? Idealmente é ter uma logica pré-definida para abortar a execução
  • 11. Thread-pool  Prove uma forma em que as threads são emprestadas para operações concorrentes que sejam rápidas.  CLR prove uma thread-pool por processo.  Threads são adicionadas ou removidas de acordo com a demanda  Permite que o custo de criar e matar threads seja reduzido durante a vida do processo  Por padrão tem a propriedade IsBackground definida como `true`  Usado de implicitamente forma padrão ao utilizar Async I/O, Delegate.Invoke, Parallel.For, PLINQ
  • 12. Parallel.For e PLINQ Usam por padrão o threadpool
  • 13. ThreadLocal State “System.NotSupportedException -> WebClient does not support concurrent I/O operations.”
  • 14. ThreadLocal State Com isso seu programa instancia mais de 100 WebClients, seu programa lança uma exceção que informa que seus webclients estão dando timeout. Você percebe que é porque sua máquina não está executando um sistema operacional de servidor, e há um limite máximo no número de conexões simultâneas.
  • 15. ThreadLocal State Nesse caso, cada operação de acesso a dados é inteiramente independente um do outro. O uso do thread-local state nos permitiu garantir que gerássemos apenas tantos objetos WebClient quanto necessário, e que cada WebClient pertence a thread que o gerou.
  • 16. ThreadLocal State O mesmo é conseguido com PLINQ utilizando o ThreadLocal<>, porém é importante ressaltar que, em qualquer cenário, usando o tipo ThreadLocal<> é mais custoso do que usar o overload de ThreadLocalState do Parallel.ForEach
  • 17. Sincronização de threads  A maior parte dos recursos dentro de um programa não são pensados para serem usados de forma concorrente.  Collections (array, list, dictionary, etc)  Files  Mesmo inteiros Oque deveria ser exibido? Oque será exibido?
  • 18. Sessões criticas  Uma sessão critica é uma região do código que ira acessar um recurso compartilhado:
  • 20. Solução 1: Atomic updates  Maior parte dos processadores suportam atomic updates
  • 22. Solução 3: Wait Based Synchronization  Quando threads necessitam de acessar o mesmo recurso que não pode ser particionado (adicionar ou remover um no de uma lista, ou manipular o mesmo arquivo)  Algumas vezes queremos que uma thread esteja block ate algum evento ocorrer.  A casos que os dados dependem de um passo anterior inviabilizando particionamento.  Quando o input de uma thread depende do output de outra  Calcular a sequencia de Fibonacci  Sequence[0] = Sequence[1] = 1  Sequence[n] = Sequence[n-1]+Sequence[n-2]
  • 24. Wait-Based Thread Synchronization Primitives  Existem vários primitivos para controle de threads no CLR System.Threading:  Monitor  Mutex  ReaderWriterLockSlim  ManualResetEvent, AutoResetEvent  Semaphore, SlimSemaphore  Os 3 primeiros compartilham o mesmo modelo de uso:  Faz uma chamada para adquirir o owner do “lock”  Usa o recurso compartilhado que o “lock” designado visa proteger  Faz um chamada para liberar o “lock” assim que o recurso não é mais necessário
  • 25. System.Threading.Monitor  Monitor garante acesso exclusivo a um recurso  CLR permite apenas uma thread entrar no contexto do monitor por vez  Outras threads que tentarem entrar irão ficar bloqueada  Assim que o recurso for liberado a próxima thread na espera ira adquirir para si o acesso exclusivo ao recurso
  • 26. Monitors no CLR  Metodos do monitor operam em cima de uma referencia de um objeto  Qualquer referencia de objeto no HEAP pode potencialmente ser associado a um lock
  • 29. Hold & Wait  As vezes uma thread precisa e esperar alguma coisa enquanto segura um lock  Em scenarios de producer/consumer é comum ter que lidar com gerenciamento de disponibilidade de recursos.  Mutipla aquisição de locks
  • 30. Hold & Wait com Monitors
  • 31. ManualResetEvent  Controle de fluxo  Precisa ser explicitamente resetado
  • 32. AutoResetEvent  Controle de fluxo  É resetado a cada WaitOne
  • 34. DEADLOCK  Deadlocks podem ocorrer a qualquer momento em que esteja numa situação de Hold & Wait  Enquento segura um lock a thread tenta obter outro lock Deadlocks podem ocorrer mas não necessariamente vão ocorrer Deadlocks são possíveis mas não necessariamente prováveis (a probabilidade aumenta de acordo com o # de threads/processadores/cores) Deadlock podem talvez ser temporário caso seja utilizado timeouts nas aquisições de lock
  • 36. Mutexes  Um Mutex é um objeto de Kernel (Sytem.Threading.Mutex)  Suporta timeout em aquisições de lock  Nomeável, permite sincronização cross-process na mesma maquina  Habilita o uso múltipla aquisições de lock com de deadlock-free via WaitHandle.WaitAll  Tradeoffs  Chamadas de aquisições e liberação de locks sempre ocorrem em kernel mode  Objetos de kernel devem ser fechados assim que não mais necessários (ocorre automaticamente mas depende do GC)
  • 37. Código propicio a deadlock
  • 39. Semaphore  Funciona de forma similar ao Monitor ou Mutex, porem ele delimita quantas threads podem acessar uma sessão critica ao mesmo tempo.  É como uma balada como uma fila, aonde as pessoas na fila esperam uma pessoa sair da balada para entrar.  System.Threading.SemaphoreSlim é mais leve, não faz chamdas de kernel, para ser usado em apenas um processo.  System.Threading.Semaphore pode ser nomeado e funciona entre processos  Não tem garantia de ordem
  • 41. ReaderWriterLockSlim  Possui trem modos : Read, Write e Ungradeable  Muitas threads podem estar simutaneamente em modo Read  Apenas uma pode entrar em modo Ungradeable mas outras threads podem entrar em modo read  Apenas uma Thread pode entrar em modo write, e nenhuma outra thread pode adquirir um lock
  • 43. Immutable Collections  NuGet System.Collection.Immutable  Thread Safe por definição
  • 44. Keyword : volatile  Não reordena instruções na memoria  “Garante” que a leitura do valor mais novo será realizada  Resolvia o problema de double null check em versões do .NET < 2  Deve ser evitado  Apenas utilizado em casos em que o cenario de locks não esta atendendo a performance desejada
  • 45. E o TPL? Async await?  IMPORTANTE: Assíncrono não é equivalente a paralelo.  A classe Task ou ValueTask não necessariamente estão vinculadas com threads.  O Método estático Task.Run() ou Task.Factory.StartNew() sempre inicia uma thread, e é a forma recomendada para se criar threads no .NET moderno.  Mais sobre isso na proxima, sobre .NET Assincrono