Programação concorrente
Threads, corridas, secções críticas, atomics, mutexes, semáforos e condições.
Threads
- Partilham endereço e descritores; cada uma tem registos, PC e pilha. Pilha não é privacidade: um apontador válido partilha o objeto.
pthread_createrecebevoid *f(void *). Dá a cada thread a sua estrutura, viva e estável até aos joins; a variável do ciclo não serve.pthread_joinrecolhe o retorno: bloco com dono ou objeto ainda vivo, nunca pilha da thread.pthread_exittermina a thread;exitoureturndemainterminam o processo.- Acessos concorrentes incompatíveis sem sincronização são data race: comportamento indefinido.
volatilenão resolve.
Exclusão e ordem
Solução clássica: exclusão mútua, progresso e espera limitada. Exclusão sozinha não dá justiça.
| Primitiva | Ideia |
|---|---|
| Mutex | protege a operação indivisível; granularidade segue os dados |
| Test-and-set / CAS | escrita atómica para construir locks |
| Spinlock | espera ativa; só para trechos curtos |
| Semáforo | wait consome, post liberta; conta ou ordena |
| Condicional | espera por predicado sob mutex |
- Fila limitada :
vazios=N,cheios=0; espera disponibilidade antes do mutex, anuncia depois de a largar. - Peterson exige atomicidade e ordem de memória; globais C comuns não chegam. Desligar interrupções numa CPU não trava as outras.
- Pthreads devolve o erro diretamente; não leias
errno.
Condição: while, sempre
pthread_cond_wait liberta o mutex e dorme atomicamente; ao voltar, reobteve-o. O sinal não reserva itens nem entrega o mutex.
pthread_mutex_lock(&mutex);
while (quantidade == 0)
pthread_cond_wait(&nao_vazio, &mutex);
int valor = buffer[saida];
saida = (saida + 1) % CAPACIDADE;
quantidade--;
pthread_cond_signal(&nao_cheio);
pthread_mutex_unlock(&mutex);
- Reavalia com
while: há despertares espúrios e outro consumidor pode levar o item. - Produtor: espera enquanto cheio, insere, sinaliza. Fim com vários consumidores: flag sob o mesmo mutex e
broadcast. - Hoare entrega o monitor a quem espera; Mesa (Pthreads) deixa o sinalizador continuar e exige reavaliação.
- Leitores/escritores: vários leitores ou um escritor. Preferência contínua por um lado deixa o outro em inanição.