Threads, em C, C++, Java, PHP, Python ou qualquer outra linguagem de programação, são fluxos de execução independentes de um mesmo programa.
Threads são funções que rodam em “background”, ou seja, enquanto que o programa executa a função main()
- em C, uma thread poderá estar executando ao mesmo tempo que main() em paralelo.
Por isso podemos dizer que programar com threads é o equivalente a programar multitarefa.
Contexto do exemplo
Meus alunos, que estão iniciando em técnicas de programação utilizando a linguagem C, são desafiados com a implementação de um jogo simples em ambiente texto, e sempre se deparam com a vontade / necessidade de mostrar o tempo ou o relógio do jogo em paralelo com a execução da lógica principal.
Neste pequeno artigo apresento a implementação de um exemplo que executa dois loops - laços, na rotina principal (main) porém, que ao mesmo, exibe em um canto da tela o tempo decorrido em segundos.
Além da demonstração da Programação com Threads em C, é possível verificar o uso de rotinas como gotoxy
- posicionamento de cursor na tela ou console, e sleep
- pausa de execução do código-fonte.
Sobre Threads
Vamos melhorar o conceito da introdução, uma explicação simplificada é dizer que elas são “canais” de execução de rotinas em sistemas, permitindo que várias funções sejam processadas paralelamente em um mesmo aplicativo.
Desta maneira, programar com Threads é o equivalente a programar Multitarefa ou Multithreading.
Multithreading é uma forma especializada de multitarefa, sendo que multitarefa é o recurso que permite ao computador executar dois ou mais programas ou funções - rotinas, simultaneamente.
Em geral, existem dois tipos de multitarefa: baseada em processos e baseada em threads.
A multitarefa baseada em processos lida com a execução simultânea de programas. A multitarefa, a que será demonstrada neste artigo, é baseada em thread e lida com a execução simultânea de partes do mesmo programa.
Um programa multithread contém duas ou mais partes que podem ser executadas simultaneamente. Cada parte desse programa é chamada de thread e cada thread define um caminho de execução separado - como exemplificado na figura acima.
A linguagem de programação C não contém nenhum suporte embutido para aplicativos multithread. Em vez disso, ele depende inteiramente do sistema operacional para fornecer esse recurso.
Em nosso exemplo simples a seguir, a função _beginthread()
da biblioteca process.h
está sendo utilizada para mostrar o tempo de execução em segundos, enquanto dois laços de repetição são processados na thread (função) principal.
Ambiente de programação
Para o exemplo a seguir o seguinte ambiente de programação foi configurado e utilizado para a criação e execução do código:
Código de relógio usando threads em linguagem de programação C
A seguir o código do exemplo na íntegra:
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <conio2.h>
int executando; // variavel global que controlar se o aplicativo esta executando
// ela garantira o encerramento das threads abertas quando seu valor for zero
void relogio () {
// o tipo long comporta numeros nao fracionados
// com valor superior (longo) ao tipo
int long inicio = time(NULL);
long agora;
while (executando != 0) {
agora = time(NULL);
// posiciona o relogio na coluna 1 linha 1
// a tela de texto tem 80 colunas por cerca de 23 linhas
gotoxy(1,1);
printf ("Tempo: %d\n", agora - inicio);
// este comando segura a execucao do codigo pelo tempo em milisegundos passado por parametro
// neste caso seguramos em 1 segundo
_sleep(1000);
}
printf ("Relogio parado!\n\n");
}
int main(int argc, char *argv[]) {
int x;
executando = 1;
// inicia a thread que executara a funcao relogio em paralelo com o restante da aplicacao
_beginthread(relogio, 0, NULL);
for (x=0; x<10000; x++) {
// posiciona o texto na coluna 1 linha 5
// a tela de texto tem 80 colunas por cerca de 23 linhas
gotoxy(1,5);
printf ("For do MAIN %d\n", x);
}
for (x=0; x // posiciona o relogio na coluna 1 linha 10
// a tela de texto tem 80 colunas por cerca de 23 linhas
gotoxy(1,10);
printf ("Novo For do MAIN %d\n", x);
}
// setando o valor desta variavel como 0 garantimos que o while do relogio para a
execucao
executando = 0;
system("PAUSE");
return 0;
}
Compile o código e o execute, você verá a contagem dos segundos enquanto o o sistema está executando a função main()
.
Comentários