Vous êtes sur la page 1sur 6

CERTIFICAO C# - EXAME 70-483

ENTENDENDO THREADS
Colocao do problema: uma CPU capaz de executar
apenas uma task (tarefa/operao) por vez. Outras tarefas ficam
pausadas at que aquela que est em foco seja finalizada. O que
significa que outras operaes ficariam paralisadas e o computador
no responderia ao usurio. A operao em foco, para piorar a
situao, pode ter uma longa durao e conter um bug, de modo que
ela nunca chegue ao fim de sua execuo. Por causa disso, no resta
outra coisa seno reiniciar a mquina (machine).
Soluo do problema: para resolver esse problema usamos o
conceito de threads. Por exemplo, no Windows cada aplicativo
executado em seu prprio processo, de modo que cada processo isola
um aplicativo de outros aplicativos. Isso confere cada processo sua
prpria memria virtual, garantindo que diferentes processos no
podem influenciar uns aos outros e que cada uma seja executado em
seu prprio segmento. Se uma aplicativo falhar ou atingir um loop
infinito, apenas o processo desse aplicativo ser afetado.
Definio simples de thread: podemos definir thread algo
como uma CPU virtual.
Gerenciamento da thread: o prprio sistema operacional
gerencia todas threads existentes para garantir que elas podem
fazer seu trabalho. Esses gerenciamentos de tasks vem com uma
sobrecarga (overhead). O sistema operacional (Windows) permite
que cada thread seja executada por um determinado perodo de
tempo. Em terminando esse perodo, o Windows pausa a thread e
alterna para outra thread. Isso chamado de mudana de contexto
(switching).
O que significa esse gerenciamento de thread na
prtica? Significa que o Windows (sistema operacional) tem que
fazer algum trabalho para que isso acontea. A thread corrente ou a
thread que est no contexto usa certa rea da memria, usa
registros da CPU e outros estados de dados (state data). O Windows
tem que se certificar que todo contexto da thread seja salvo e
restaurado em cada contexto (switch).
Ainda que o sistema operacional tenha algum sucesso em
permitir que cada thread seja executada por um determinado perodo
de tempo, o uso de threads garante que cada processo obtenha seu
tempo para executar sem ter que esperar at que todas as outras
operaes possam ser concludas. Isso melhorar a capacidade de
resposta do sistema (operacional) e d a iluso de que uma CPU pode
executar vrias tarefas de uma vez. Dessa forma, podemos criar um
aplicativo que usa paralelismo (parallelism). O que significa que ele
pode executar vrios segmentos em diferentes CPUs em paralelo.
Quase todos os dispositivos hoje tm uma CPU com vrios
ncleos, que semelhante a ter vrias CPUs. Alguns servidores no
tm apenas CPUs multicore, mas tambm tm mais de uma CPU. Para
fazer uso de todos esses ncleos, precisamos de multithreading. O
Windows garante que esses threads sejam distribudos pelos seus
ncleos disponveis. Desta forma, podemos executar vrias tarefas ao
mesmo tempo e melhorar a escalabilidade do sistema. Devido
sobrecarga associada, podemos determinar cuidadosamente se
precisamos de multithreading. Mas se quisermos usar threads para
escalabilidade ou capacidade de resposta (de um aplicativo), o C# e
o Framework .NET oferecem muitas possibilidades.

USO DE THREADS
A classe thread pode ser encontrada no namespace
System.Threading. Essa classe nos permite:
A criar novas threads,
A gerenciar sua prioridade,
A obter seu status.
No usamos thread em todos os aplicativos que criamos. Salvo
quando a necessidade assim exigir. Mas ao usar a classe Thread
temos controle sobre todas as suas opes de configurao.
Podemos:
Especificar a prioridade de uma thread,
Informar ao Windows o tempo de execuo de uma thread
(longo ou curto),
Configurar outras opes avanadas.

O exemplo a seguir mostra como usar a classe Thread para


executar um mtodo em outra thread. A classe Console sincroniza o
uso do fluxo de sada daquilo que escrevemos em
Console.WriteLine(), por exemplo, a partir de vrias threads.
O que sincronizao? A sincronizao o mecanismo que
garante que dois segmentos de uma parte especifica de um programa
no execute ao mesmo tempo. No caso de um aplicativo de console,
isso significa que nenhum dois segmentos podem escrever dados na
tela exatamente no mesmo tempo. Se uma thread estiver
trabalhando com o fluxo de sada, outras threads tero que esperar
antes que ele seja concludo.

Exemplo 1 - criando uma thread com a class Thread:


using System;
using System.Threading;

namespace ConsoleApplication
{
public class Program
{
public static void ThreadMethod()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0); // Usada para assinalar para Windows
que esta thread terminou. Imediatamente inicia-se a outra
thread
}
}
public static void Main()
{
Thread t = new Thread(new ThreadStart(ThreadMethod));
t.Start();
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}

/* mtodo Thread.Join chamado na thread principal


para deix-lo esperar at que a outra thread termine.
*/
t.Join();
Console.WriteLine("ThreadMethod Finalizada");
Console.Read();
}
}
}

Algumas observaes:
Thread.Sleep(0); - Assin-la para o Windows que a thread que
est no contexto terminou. Imediatamente inicia-se a outra
thread.
t.Join(); - O mtodo Thread.Join chamado em uma thread
principal para deix-lo esperar at que a outra thread termine.
Tanto o processo como thread tem uma prioridade. Atribuir uma
prioridade baixa til para aplicaes como proteo de tela. Tal
aplicativo no deve competir com outros aplicativos pelo tempo de
execuo de CPU. Thread com alta prioridade deve ser usada
somente quando for absolutamente necessrio. Thread com
atribuio de prioridade normal pode ser usada para quase todos os
cenrios.

DIFERENA ENTRE FOREGROUND E BACKGROUND


THREADS
Foreground thread: pode ser usada para manter uma aplicao
ativa. Somente quando foreground thread finalizar a common
Language runtime (CLR) encerra a aplicao.
Background threads: finaliza a aplicao imediatamente se o
mtodo IsBackground estiver setado como true. Veja o exemplo:
using System;
using System.Threading;
namespace ConsoleApplication
{
public class Program
{
public static void ThreadMethod()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(1000);
}
}
public static void Main()
{
Thread t = new Thread(new ThreadStart(ThreadMethod));
t.IsBackground= true;
t.Start();
}
}
}

Sada com t.IsBackground = true:

A aplicao foi encerrada imediatamente.


Sada com t.IsBackground = false:

Cria-se uma foreground thread e a aplicao escreve na tela a


mensagem de sada do mtodo Console.WriteLine("ThreadProc:
{0}", i);

Vous aimerez peut-être aussi