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.

Threads

Exemplo de programação e execução em threads executando em paralelo na linha do tempo

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().