VidaGeek.net

Linux, Open-source, Programação e Produtividade

Archive for March, 2007

Dia C - Threads em C

Para deixar um sistema mais rápido (e muitas vezes mais “macio”) é necessário que você execute várias coisas ao mesmo tempo. Você não precisa fazer com que seu programa simplesmente pare de fazer algo simplesmente porque o usuário clicou em outro botão. Você também pode estar querendo aproveitar um segundo processador da máquina ou mesmo aumentar o número de acessos ao processador (é difícil fazer um jogo rodar quando o Windows come metade do sistema e o anti-vírus mastiga o resto). O que fazer então? Bom, você poderia pedir pro usuário fechar o anti-vírus (o que ele não vai fazer) ou mandar ele apelar pro bom senso e desligar o tocador de mp3, Word, Messenger, Internet Explorer e todas as tranqueiras que ele tem em stand-by para então rodar o seu programa. Esquece… Isso não vai acontecer. O que nós programadores podemos fazer, então? Simples. Podemos dividir o nosso programa em várias threads e aumentar a prioridade delas, aumentando o nosso acesso ao(s) processador(es) e diminuindo o dos outros programas. Mas vamos com calma.

Uma thread é basicamente um outro programa rodando mas que tem os mesmos direitos de acesso à memória que o programa que carrega ela (que seria a thread principal). Esta não é a definição formal. É mais uma utilidade prática do negócio. Como ele tem os mesmos direitos de acesso à memória, compartilhar dados entre os dois programas é fácil. E cada um tem sua própria pilha, então nem precisa se preocupar com um eventual estouro dela (não abusem dessa frase, é possível estourar a pilha, apenas menos provável).

C não possui nenhum suporte nativo à threads (isso é algo que depende muito do kernel do sistema operacional, pois é ele quem coordena os processos - entenda como threads + programas - e verifica quando estes vão pro processador e para qual processador vão). Então é necessário que você utilize uma biblioteca do sistema operacional.

O Windows utiliza o header windows.h (sugestivo, não?), mas qualquer coisa que você compile que tenha incluído esse header irá demorar milênios para compilar, pois esse header é realmente imenso. Para evitar isso, defina a constante WIN32_LEAN_AND_MEAN antes de incluir o header e assim você evitará incluir um monte de coisas nas quais você provavelmente não está interessado.

Linux e MacOS X utilizam a pthread.h. MacOS Clássico não possui suporte nativo, mas difícilmente você irá produzir uma aplicação pra clássico hoje em dia.

Mas e se eu quiser produzir uma aplicação portável entre alguns desses sistemas, o que que eu faço? Vou ter que forçar a portabilidade “no braço” com #ifdef ? Não. Você pode usar uma das seguintes bibliotecas:

  • SDL : A biblioteca SDL possui suporte à threads e é portável para esses sistemas que eu citei acima a vários outros.
  • pthread : pthread? Sim. A pthread possui ports para Windows também. A vantagem é que a pthread é implementada e possui todas as funcionalidades em qualquer um dos sistemas. A SDL_Thread possui apenas as funcionalidades comuns desses sistemas. (Não coloquei o link porque Pthread é a especificação Posix para Threads. Portanto qualquer implementação que siga essas especificações é uma pthread.)
  • pth : A pth é implementação de threads do projeto GNU, que roda em vários sistemas.
  • Existem algumas outras, mas essas provávelmente são as três mais poderosas

Mas antes que você pense que threads são a solução para todos os problemas, tome cuidado. Thread é uma ferramenta poderosa, mas é bem complicado de utilizá-la. Recomendo que estude seriamente programação concorrente antes de se aventurar pelos incontáveis erros de sincronismo praticamente indetectáveis que as threads produzem.

Próxima semana: Ponteiros e Aritmética de Ponteiros.

Posts Relacionados:

  • Séries
  • Dia C - Recursão
  • Game Developers Conference
  • Digam adeus ao mouse
  • Um dia na vida de um programador azarado
  • O Mal da Google
  • CeBIT
  • Acompanhe-nos por RSS, por Email ou via Twitter.

    Guia Linux - Parte I: Introdução

    Esta é a primeira parte de um guia que pretende mostrar como instalar uma distribuição Linux em sua máquina, possibilitando que você tenha um sistema completamente funcional, com todas as ferramentas que você pode precisar e sem nenhum custo, exceto, talvez algumas horas de aprendizado.

    Esse guia não tem o objetivo de ser um tutorial, pois já existem muitas páginas de como instalar o Linux em sua máquina. Ele é na verdade um roadmap (mapa de estrada) que tem como objetivo indicar referências para as informações necessárias para a instalação de um sistema open-source funcional. Todos os passos desse guia serão executados na mesma máquina com a mesma instalação, e portanto, conforme o guia se desenvolver o sistema também melhorará.

    Todos os problemas ocorridos por causa de Hardware, configuração, falta de atualização dos tutoriais utilizados, etc, serão abordados. Nem sempre a solução de um problema será igual para todos, e nem sempre exisitirá essa solução. Mas todos os problemas serão mencionados e suas possiveis correções.

    A distribuição a ser usada será o Gentoo (http://www.gentoo.org/) por simples preferência pessoal. Ela é considerada uma distribuição forte, porém díficil. Eu não vejo dessa forma, a instalação com o LiveCD é feita facilmente e a instalação manual requer apenas a leitura do manual. Para instalação de softwares ela utiliza o Portage, acessado pelo comando emerge que permite a fácil instalação da maior parte dos aplicativos. Aqui surge uma diferença, na minha opinião, fundamental: os softwares instalados com o emerge são compilados na sua máquina, possibilitando assim uma alta performace. Muitos gerenciadores de pacotes trabalham principalmente com arquivos já compilados, feitos para sistemas genéricos, e portanto, não otimizados para o seu sitema.

    Instalando o Sistema

    1. Baixando a distribuição: Em http://www.gentoo.org/main/en/where.xml você encontra as opções de download para várias plataformas. Os usuários de computadores PC de 32 bits devem escolher uma imagem para x86, os usuários com processadores 64 bits devem escolher amd64 (mesmo que seu processador seja Intel). Você tem agora duas opções, com suas vantagens e desvantagens:

    • Minimal: O CD contém apenas o necessário para rodar o sistema inicial, sendo que todo o seu sistema será baixado da internet durante os primeiros passos da instalação. A instalação é toda em modo texto e manual, por isso pode ser difícil e intimidadora na primeira vez. Você terá que ler todo o manual para conseguir instalar mesmo que já tenha usado o Linux antes. Após a instalação você terá que configurar o ambiente gráfico. A vantagem é que todo o seu sistema vai ser compilado especificamente para a sua máquina.
    • LiveCD: O CD contém, além do necessário para a instalação, um ambiente gráfico e um script de instalação amigável. A instalação é normalmente em modo gráfico, mas pode ser feita em modo texto também. A instalação será bem mais fácil do que a manual, e deixará o ambiente gráfico funcionando após a instalação. Você pode também usar o ambiente gráfico durante a instalação, por exemplo para ler este post. Mas pro outro lado o sistema será instalado com softwares já compilados e seu sistema não será muito otimizado.

    Eu particulamente uso o Minimal, já fiz algumas instalações com o LiveCD quando estava com problemas com o modo gráfico. Se tiver tempo e paciência use a Minimal, se não tiver nenhum dos dois ou for um iniciante em Linux e estiver inseguro use o LiveCD. Mais sobre as diferenças em http://www.gentoo.org/doc/pt_br/handbook/handbook-x86.xml?part=1&chap=2

    Manual de Instalação - Minimal:

    Manual de Instalação - LiveCD:

    Dicas:

    • O cfdisk faz particionamente igual ao fdisk, mas é mais intuitivo.
    • Quando o manual pedir para você baixar o stage3, aproveite para pegar o snapshot que ele pede mais pra frente, pois são downloads demorados. Você pode ir tomar um café ou ler outros posts nossos enquanto isso.
    • Se tiver um pouco de paciência e curiosidade, compile o kernel você mesmo ao invés de usar o genkernel. O genkernel usa o coldplug, que, até a útilma vez que vi, bloqueava a atualização do udev.
    • Quando fizer a instalação da rede você pode utilizar um software muito bom, o ifplugd (emerge ifplugd), para apenas tentar conectar se algum cabo estiver plugado na sua rede.
    • emerge links permite que você acesse a internet em modo texto, algo muito útil caso o seu sitema quebre.

    Problemas:

    • “C compiler cannot create executables” no emerge portage. Inicialmente achei que fosse um problema no gcc, mas mesmo com emerge gcc isso não adiantou. Na verdade o meu /etc/make.conf estava configurado para pentium-4(errado) e não pentium4(correto). Então se você tiver esse problema de uma olhada na sua CFLAGS para ter certeza que está tudo certo.

    Se você optou pelo LiveCD, você tem agora uma instalação quase completamente funcional. Se você escolheu o minimal, deve ainda instalar o ambiente gráfico. Outros itens de hardware também devem ser instalados, como placa de som, placa wireless (possivelmente), etc. Algumas coisas também precisam ser configuradas. Na próxima parte do guia irei abordar esses assuntos. Uma coisa interessante agora seria usar o emerge –update world para atualizar o seu sistema (isso pode fazer seu sistema quebrar se você usou o LiveCD).

    Posts Relacionados:

  • Gentoo no Summer of Code
  • Séries
  • Gerenciadores de dispositivos no Linux
  • Ubuntu como Ferramenta de Recuperação
  • Guia Linux - Parte IV: Aplicativos
  • Show Us The Code, Mr. Ballmer!!!
  • As melhores de primeiro de abril 2007
  • Acompanhe-nos por RSS, por Email ou via Twitter.

  • 9 Comments
  • Filed under: Gentoo, Linux
  • O blog Nomadishere publicou um post com as oito coisas que todo geek, nerd ou pessoa criativa precisa pra produzir mais no trabalho.
    Uma versão adaptada em português pode ser encontrada aqui.

    Posts Relacionados:

  • INC - Isso Não Compila!!!
  • O Iogurte Indutivo
  • Nova Coluna Semanal: Geek Style of Life
  • Quer trabalhar na Google?
  • Dia C - Threads em C
  • INC - Colisão de Nomes de Métodos
  • O mal dos programadores
  • Acompanhe-nos por RSS, por Email ou via Twitter.

  • 0 Comments
  • Filed under: Dicas
  • O blog Na Mira do Linux publicou diversas coisas que podem ser compradas com o dinheiro que você gastaria na edição Home do Windows Vista. Vale a pena conferir.

    Posts Relacionados:

  • Microsoft e reconhecimento de voz
  • Bad Bad Vista, no donut for you…
  • Eleições, spam e telefonemas com gravações
  • SNL - As Brumas de Avalon
  • Propaganda do Windows Live
  • YACP - Definindo seus próprios tipos
  • Firefox começa a dominar Europa
  • Acompanhe-nos por RSS, por Email ou via Twitter.

  • 0 Comments
  • Filed under: Dicas, Linux

  • Publicidade