SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
Controlando a
Concorrência em
Aplicações Multi-Thread
Mário Guedes
O QUE É THREAD?
Definições
• Thread, ou segmento, é a unidade básica de
execução de um Sistema Operacional moderno;
• Um software tem, no mínimo, uma thread: A
thread principal;
• Para que um software possa fazer mais de uma
tarefa ao “mesmo tempo” devemos criar nossas
próprias threads;
“Ao mesmo tempo” entre aspas!
• Devemos ter consciência de que o Sistema
Operacional gerencia as execuções das threads e
que só uma thread é executada a um só tempo;
• Só quando temos mais de um núcleo é que o
Sistema Operacional estará executando várias
threads, efetivamente, ao mesmo tempo:
4 núcleos = 4 threads simultâneas
Gerenciador de tarefas do
Windows
Vantagens em utilizar Threads
• Hoje os equipamentos tem vários núcleos e nossos
softwares podem, efetivamente, tirar proveito
disso;
• Velocidade de execução;
• Escalabilidade;
• Tarefas em segundo plano;
• Monitoração de eventos;
• etc;
Classe TThread
• No Delphi temos a classe TThread presente na unit
System.Classes;
• Ela abstrai as chamadas à API do Windows para se
criar uma thread;
• Possui propriedades e métodos para o efetivo
controle da thread;
• E de uma vez por todas: TTimer não é uma thread.
Máscara de afinidade
Para que duas ou mais threads sejam executadas
efetivamente ao mesmo tempo e portanto tenha o
desempenho melhorado, podemos definir a afinidade
da thread com um ou mais núcleos:
cRet := SetThreadAffinityMask(GetCurrentThread, Self.FNucleo);
if (cRet = 0) then
begin
cRet := GetLastError;
sErro := SysErrorMessage(cRet);
end;
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx
PROBLEMÁTICA DA
CONCORRÊNCIA
Recursos críticos
• Quando optamos por trabalhar com threads temos
que gerenciar os recursos críticos;
• Por recurso crítico entenda tudo aquilo que só pode
ser manipulado por apenas uma thread a um só
tempo, como por exemplo:
• Componentes da VCL;
• Tabelas;
• Arquivos (em especial escrita);
• Conexão TCP/IP;
• etc;
Componentes da VCL
• A classe TThread possui o método Synchronize que sincroniza o
processamento com a thread principal;
• Neste cenário, é a thread principal que executa o comando sincronizado;
• Os componentes da VCL essencialmente manipulam as mensagens do
Windows;
• Se uma thread precisa manipular elementos da interface essa
manipulação deve ser feita via Synchronize.
• Deve-se evitar que uma thread faça usa massivo de elementos de
interface pois perde-se o ganho que a thread oferece;
• O uso do Synchronize degrada a performance do sistema, portanto use
apenas quando e onde for necessário;
Exemplo prático
Exemplo prático #1
Seção crítica
• Há elementos que não devem ser acessados ao mesmo tempo por
mais de uma thread mas que não envolve elementos da VCL e
portanto não precisam ser sincronizados;
• Para isto podemos utilizar a classe TCriticalSection presente na
unidade System.SyncObjs;
• Funciona como um semáforo: abre passagem para um, fecha
passagem para outros;
• Para entrar na seção crítica usamos o método Enter . Se a seção já
estiver ocupada ficaremos aguardando até que a mesma seja
liberada pela outra thread;
• Para liberar a seção crítica usamos o método Release ;
Seção crítica: cenário de
exemplo
Thread
Cliente
A
Thread
Cliente
B
Thread
Cliente
C
Thread
Cliente
D Pilha de
objetos
Thread de
processamento
da pilha
ConexõesTCP/IP
Seção Crítica
Exemplo prático
Exemplo prático #2
Sinalização para Thread
• Um fator importante no desenvolvimento multi-thread é
quando a thread fica ociosa aguardando algum evento;
• Em geral ficamos em um loop infinito o que consome
recursos do ambiente;
• Podemos então usar a classe TEvent , que nos permite
aguardar uma sinalização externa;
• A thread fica hibernando até ser acionado pelo evento, o
que é feito a partir do método SetEvent;
• Importante frisar que o nome passado na criação do
TEvent deve ser único em todo o Sistema Operacional!
Exemplo prático
Exemplo prático #3
Incremento de variável do tipo
Integer
• Eventualmente o recurso crítico é a geração de um ID por
exemplo, resultado do incremento de uma variável integer;
• Se duas threads executarem o método ao mesmo tempo
poderão ler o mesmo valor e escrevendo o mesmo
incremento;
• Neste caso específico podemos usar os métodos
InterlockedIncrement , InterlockedDecrement além de
outras opções;
• É uma function que faz a operação desejada e retorna o
valor;
Aguardando várias threads
• Ao se dividir um processamento em thread, pode ser
necessário aguardar que todas finalize para dai iniciar
um processo posterior;
• A instrução WaitForMultipleObjects é uma ótima
alternativa para isto;
• Basicamente passa-se para a função um array de
Handles das threads envolvidas;
• Quando um objeto TThread finaliza é dados um
CloseHandle e com isso o WaitForMultipleObjects é
acionado.
Exemplo prático
Exemplo prático #4
Links interessantes
• Balaio Tecnológico
Luís Gustavo Fabbro
http://balaiotecnologico.blogspot.com.br/2009/08/trabalhando-com-threads.html
• About.com Delphi Programming
Zarko Gajic
http://delphi.about.com/od/kbthread/Threading_in_Delphi.htm
• Eu Gosto do Delphi
Mário Guedes
http://eugostododelphi.blogspot.com.br/search/label/thread
Perguntas?
• Portal de Treinamentos e Vagas – http://www.edobrasil.net/treinamentos
• Embarcadero Developer Network - http://edn.embarcadero.com
• Diretório de MVP’s - http://www.embarcadero.com.br/mvp-directory
• Documentação dos Produtos - http://docs.embarcadero.com
• CodeRage 7 - http://www.embarcadero.com/coderage
• YouTube - http://youtube.com/user/embarcaderodobrasil
• Twitter - https://twitter.com/EmbarcaderoBR http://twitter.com/EmbarcaderoTech
• Blogs: http://blogs.embarcadero.com
• Facebook:
https://www.facebook.com/pages/Embarcadero-Delphi-Brasil/399151510134179
• atendimento@embarcadero.com.br
• (11) 5643-1333
Obrigado!
Mário Guedes
mario.guedes@arrayof.com.br
http://eugostododelphi.blogspot.com
http://br.linkedin.com/in/jmarioguedes
http://facebook.com/eugostododelphi
http://twitter.com/eugostododelphi

Mais conteúdo relacionado

Mais procurados

Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on Rails
Sergio Henrique
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
Igor Sobreira
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
Francisco Santos
 
Apresentação python fábio jr alves
Apresentação python   fábio jr alvesApresentação python   fábio jr alves
Apresentação python fábio jr alves
Grupython Ufla
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
Alvaro Oliveira
 

Mais procurados (20)

Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Delphi Conference 2011 - Desmistificando as Expressões Regulares
Delphi Conference 2011 - Desmistificando as Expressões RegularesDelphi Conference 2011 - Desmistificando as Expressões Regulares
Delphi Conference 2011 - Desmistificando as Expressões Regulares
 
Paradigmas do Ruby
Paradigmas do RubyParadigmas do Ruby
Paradigmas do Ruby
 
Ruby
RubyRuby
Ruby
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Curso básico de Algoritmos com Python
Curso básico de Algoritmos com PythonCurso básico de Algoritmos com Python
Curso básico de Algoritmos com Python
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesPalestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015
 
Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on Rails
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
 
Apresentação python fábio jr alves
Apresentação python   fábio jr alvesApresentação python   fábio jr alves
Apresentação python fábio jr alves
 
Introdução à linguagem Python
Introdução à linguagem PythonIntrodução à linguagem Python
Introdução à linguagem Python
 
Frameworks PHP
Frameworks PHPFrameworks PHP
Frameworks PHP
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
 
Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001
 

Destaque

Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
Ryan Padilha
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
Ryan Padilha
 
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelDesign Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Ryan Padilha
 
Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)
Ryan Padilha
 
Curso De Programação Em DelPhi
Curso De Programação Em DelPhiCurso De Programação Em DelPhi
Curso De Programação Em DelPhi
MikeNandes
 

Destaque (17)

Fortes Papo Developer
Fortes Papo DeveloperFortes Papo Developer
Fortes Papo Developer
 
Delphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração ContínuaDelphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração Contínua
 
Delphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoDelphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no Código
 
Curso de Delphi - Banco de Dados
Curso de Delphi - Banco de DadosCurso de Delphi - Banco de Dados
Curso de Delphi - Banco de Dados
 
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
 
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015
Gnostice Suporte completo a PDF e Office �- Embarcadero Conference 2015Gnostice Suporte completo a PDF e Office �- Embarcadero Conference 2015
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Git & Delphi
Git & DelphiGit & Delphi
Git & Delphi
 
Delphi XE7 - O que há de novo?
Delphi XE7 - O que há de novo?Delphi XE7 - O que há de novo?
Delphi XE7 - O que há de novo?
 
Linguagem Delphi-Introdução
Linguagem Delphi-IntroduçãoLinguagem Delphi-Introdução
Linguagem Delphi-Introdução
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Oo delphi
Oo delphiOo delphi
Oo delphi
 
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelDesign Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
 
Programação orientada a objetos em delphi
Programação orientada a objetos em delphiProgramação orientada a objetos em delphi
Programação orientada a objetos em delphi
 
Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)
 
Curso De Programação Em DelPhi
Curso De Programação Em DelPhiCurso De Programação Em DelPhi
Curso De Programação Em DelPhi
 

Semelhante a Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread

Programação Paralela - Threads
Programação Paralela - ThreadsProgramação Paralela - Threads
Programação Paralela - Threads
Glaucio Scheibel
 
Java recursos avançados - multithreading
Java   recursos avançados - multithreadingJava   recursos avançados - multithreading
Java recursos avançados - multithreading
Armando Daniel
 

Semelhante a Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread (20)

Concorrência em Android
Concorrência em AndroidConcorrência em Android
Concorrência em Android
 
Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreading
 
12 threads
12 threads12 threads
12 threads
 
Net - Threads
Net - ThreadsNet - Threads
Net - Threads
 
Thread Java
Thread JavaThread Java
Thread Java
 
Programação Paralela - Threads
Programação Paralela - ThreadsProgramação Paralela - Threads
Programação Paralela - Threads
 
Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Threads - .Net Framework 4.0
Threads - .Net Framework 4.0
 
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)
 
Trabalhando com Threads em JAVA
Trabalhando com Threads em JAVATrabalhando com Threads em JAVA
Trabalhando com Threads em JAVA
 
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...
 
Java recursos avançados - multithreading
Java   recursos avançados - multithreadingJava   recursos avançados - multithreading
Java recursos avançados - multithreading
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
Revisão de C# 4.0
Revisão de C# 4.0Revisão de C# 4.0
Revisão de C# 4.0
 
Threads em java
Threads em javaThreads em java
Threads em java
 
Aula java[1]
Aula java[1]Aula java[1]
Aula java[1]
 
Threads 01: Criação e controle de threads
Threads 01: Criação e controle de threadsThreads 01: Criação e controle de threads
Threads 01: Criação e controle de threads
 
Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
04 threads
04 threads04 threads
04 threads
 

Mais de Mario Guedes

Mais de Mario Guedes (20)

O que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST SummitO que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST Summit
 
Fazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDISFazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDIS
 
Integrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da EthereumIntegrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da Ethereum
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Expressão Regular - Cookbook
Expressão Regular - CookbookExpressão Regular - Cookbook
Expressão Regular - Cookbook
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google Maps
 
Foco no app, viva o serverless!
Foco no app, viva o serverless!Foco no app, viva o serverless!
Foco no app, viva o serverless!
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google Maps
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!
 
Escalabilidade com Redis
Escalabilidade com Redis Escalabilidade com Redis
Escalabilidade com Redis
 
Escalando o backend com NGINX e Redis
Escalando o backend com NGINX e RedisEscalando o backend com NGINX e Redis
Escalando o backend com NGINX e Redis
 
Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!
 
Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?
 
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiTDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
 
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
 
Extreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe DelphiExtreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe Delphi
 
Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?
 
BOT: Conversando com o seu sistema
BOT: Conversando com o seu sistemaBOT: Conversando com o seu sistema
BOT: Conversando com o seu sistema
 
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
 
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuáriosExtreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
 

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread

  • 1. Controlando a Concorrência em Aplicações Multi-Thread Mário Guedes
  • 2. O QUE É THREAD?
  • 3. Definições • Thread, ou segmento, é a unidade básica de execução de um Sistema Operacional moderno; • Um software tem, no mínimo, uma thread: A thread principal; • Para que um software possa fazer mais de uma tarefa ao “mesmo tempo” devemos criar nossas próprias threads;
  • 4. “Ao mesmo tempo” entre aspas! • Devemos ter consciência de que o Sistema Operacional gerencia as execuções das threads e que só uma thread é executada a um só tempo; • Só quando temos mais de um núcleo é que o Sistema Operacional estará executando várias threads, efetivamente, ao mesmo tempo: 4 núcleos = 4 threads simultâneas
  • 6. Vantagens em utilizar Threads • Hoje os equipamentos tem vários núcleos e nossos softwares podem, efetivamente, tirar proveito disso; • Velocidade de execução; • Escalabilidade; • Tarefas em segundo plano; • Monitoração de eventos; • etc;
  • 7. Classe TThread • No Delphi temos a classe TThread presente na unit System.Classes; • Ela abstrai as chamadas à API do Windows para se criar uma thread; • Possui propriedades e métodos para o efetivo controle da thread; • E de uma vez por todas: TTimer não é uma thread.
  • 8. Máscara de afinidade Para que duas ou mais threads sejam executadas efetivamente ao mesmo tempo e portanto tenha o desempenho melhorado, podemos definir a afinidade da thread com um ou mais núcleos: cRet := SetThreadAffinityMask(GetCurrentThread, Self.FNucleo); if (cRet = 0) then begin cRet := GetLastError; sErro := SysErrorMessage(cRet); end; http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx
  • 10. Recursos críticos • Quando optamos por trabalhar com threads temos que gerenciar os recursos críticos; • Por recurso crítico entenda tudo aquilo que só pode ser manipulado por apenas uma thread a um só tempo, como por exemplo: • Componentes da VCL; • Tabelas; • Arquivos (em especial escrita); • Conexão TCP/IP; • etc;
  • 11. Componentes da VCL • A classe TThread possui o método Synchronize que sincroniza o processamento com a thread principal; • Neste cenário, é a thread principal que executa o comando sincronizado; • Os componentes da VCL essencialmente manipulam as mensagens do Windows; • Se uma thread precisa manipular elementos da interface essa manipulação deve ser feita via Synchronize. • Deve-se evitar que uma thread faça usa massivo de elementos de interface pois perde-se o ganho que a thread oferece; • O uso do Synchronize degrada a performance do sistema, portanto use apenas quando e onde for necessário;
  • 13. Seção crítica • Há elementos que não devem ser acessados ao mesmo tempo por mais de uma thread mas que não envolve elementos da VCL e portanto não precisam ser sincronizados; • Para isto podemos utilizar a classe TCriticalSection presente na unidade System.SyncObjs; • Funciona como um semáforo: abre passagem para um, fecha passagem para outros; • Para entrar na seção crítica usamos o método Enter . Se a seção já estiver ocupada ficaremos aguardando até que a mesma seja liberada pela outra thread; • Para liberar a seção crítica usamos o método Release ;
  • 14. Seção crítica: cenário de exemplo Thread Cliente A Thread Cliente B Thread Cliente C Thread Cliente D Pilha de objetos Thread de processamento da pilha ConexõesTCP/IP Seção Crítica
  • 16. Sinalização para Thread • Um fator importante no desenvolvimento multi-thread é quando a thread fica ociosa aguardando algum evento; • Em geral ficamos em um loop infinito o que consome recursos do ambiente; • Podemos então usar a classe TEvent , que nos permite aguardar uma sinalização externa; • A thread fica hibernando até ser acionado pelo evento, o que é feito a partir do método SetEvent; • Importante frisar que o nome passado na criação do TEvent deve ser único em todo o Sistema Operacional!
  • 18. Incremento de variável do tipo Integer • Eventualmente o recurso crítico é a geração de um ID por exemplo, resultado do incremento de uma variável integer; • Se duas threads executarem o método ao mesmo tempo poderão ler o mesmo valor e escrevendo o mesmo incremento; • Neste caso específico podemos usar os métodos InterlockedIncrement , InterlockedDecrement além de outras opções; • É uma function que faz a operação desejada e retorna o valor;
  • 19. Aguardando várias threads • Ao se dividir um processamento em thread, pode ser necessário aguardar que todas finalize para dai iniciar um processo posterior; • A instrução WaitForMultipleObjects é uma ótima alternativa para isto; • Basicamente passa-se para a função um array de Handles das threads envolvidas; • Quando um objeto TThread finaliza é dados um CloseHandle e com isso o WaitForMultipleObjects é acionado.
  • 21. Links interessantes • Balaio Tecnológico Luís Gustavo Fabbro http://balaiotecnologico.blogspot.com.br/2009/08/trabalhando-com-threads.html • About.com Delphi Programming Zarko Gajic http://delphi.about.com/od/kbthread/Threading_in_Delphi.htm • Eu Gosto do Delphi Mário Guedes http://eugostododelphi.blogspot.com.br/search/label/thread
  • 22. Perguntas? • Portal de Treinamentos e Vagas – http://www.edobrasil.net/treinamentos • Embarcadero Developer Network - http://edn.embarcadero.com • Diretório de MVP’s - http://www.embarcadero.com.br/mvp-directory • Documentação dos Produtos - http://docs.embarcadero.com • CodeRage 7 - http://www.embarcadero.com/coderage • YouTube - http://youtube.com/user/embarcaderodobrasil • Twitter - https://twitter.com/EmbarcaderoBR http://twitter.com/EmbarcaderoTech • Blogs: http://blogs.embarcadero.com • Facebook: https://www.facebook.com/pages/Embarcadero-Delphi-Brasil/399151510134179 • atendimento@embarcadero.com.br • (11) 5643-1333