# 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!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://concorrencia101.leandronsp.com/parte-ii-concorrencia-em-diferentes-linguagens/concorrencia-em-c.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
