> For the complete documentation index, see [llms.txt](https://concorrencia101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://concorrencia101.leandronsp.com/parte-ii-concorrencia-em-diferentes-linguagens/concorrencia-em-c.md).

# 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](https://dev.to/leandronsp/construindo-um-web-server-em-assembly-x86-parte-i-introducao-14p5).

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.

```
$ lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy

$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
```

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!
