Concorrência em C
Para entendermos concorrência, nada melhor do que começar do nível mais baixo, certo?
Calma, não vou falar de Assembly aqui, mas se você quiser entender mais de Assembly, mais especificamente x86, sugiro a leitura da minha saga escrevendo um web server em x86.
Nesta seção, iremos abordar como a linguagem C resolve os problemas de concorrência trazidos na primeira parte, seja a nível da implementação padrão ou bibliotecas externas.
Preâmbulo
A implementação de C mais amplamente utilizada é o GCC (GNU Compiler Collection), que oferece um conjunto de ferramentas para compilação, otimização e depuração de código. Essa popularidade se deve à sua maturidade, portabilidade e constante evolução, tornando-o o padrão de fato no ecossistema C.
Os exemplos aqui trazidos serão a partir de um Ubuntu 22.04.4 LTS (jammy) com gcc 11.4.0.
No que diz respeito à concorrência, a linguagem C fornece acesso direto a syscalls do sistema operacional, como fork
e clone
, que permitem a criação de processos e threads, respectivamente. Mas essas chamadas diretas exigem cuidado na manipulação, já que expõem a complexidade do sistema operacional, tornando o uso muito mais complexo.
libc
Para nossa sorte, a biblioteca padrão de C — frequentemente referida como libc — oferece abstrações de mais alto nível para facilitar o trabalho com concorrência, como a função pthread_create
, usada para gerenciar threads de maneira mais simples e segura.
Além disso, a libc fornece mecanismos para lidar com sincronização, como locks (mutexes), permitindo o controle do acesso compartilhado entre threads.
I/O assíncrono
Quando o assunto é I/O assíncrono, não há uma abstração completa na biblioteca padrão, mas syscalls como select
ou epoll
podem ser utilizadas para monitorar múltiplos descritores de arquivo e implementar loops de eventos personalizados.
Bibliotecas externas
Assim como praticamente toda linguagem de programação, o ecossistema C desenvolveu diversas bibliotecas externas de código aberto (open source) para preencher lacunas que faltam no core da linguagem ou na biblioteca padrão.
Seja no contexto de I/O assíncrono, onde padrões modernos ajudam a abstrair a complexidade das chamadas de sistema, ou no processamento de CPU, onde estratégias como o modelo de atores podem ser aplicadas, o uso de bibliotecas externas é frequentemente desejável ao trabalharmos com C.
Introdução feita, vamos agora aprender a explorar recursos de concorrência em C!
Last updated